Özel alanı yeni sürüme geçirme

Temmuz 2019'da (2.20190722 sürümü) daha kodlanmış alanlar API'si eklendi. Geriye dönük olarak mümkün olduğunca uyumlu olması amaçlanmıştır. Bu, özel alanı Temmuz 2019'dan önce oluşturduysanız büyük olasılıkla çalışmaya devam edeceği anlamına gelir. Özel alanınızın yükseltilmesi gerekip gerekmediğine karar vermeden önce Tehlikeli alanlar bölümünü okumanız ve alanınızda kapsamlı bir test yapmanız gerekir.

Temmuz 2019'dan önce alanlar arasında standartlaşma eksik olduğundan, bir geliştiricinin yapması gereken tüm değişiklikleri kapsamak zor olabilir. Bu dokümanda, olası tüm değişiklikler ele alınmaya çalışılır. Ancak bu dokümanda ilgilendiğiniz bir şey yoksa lütfen yeni sürüme geçiş yardımı alma bölümünü okuyun.

Tehlikeli alanlar

Tehlikeli bölgeler, API'nin değiştiği bilinen yerlerdir ve alanınız bozulabilir.

Blockly.Field.register

Alanlar artık Blockly.Field.register(); aracılığıyla kayıtlı değil. Artık kaydı yöneten bir FieldRegistry ad alanı vardır.

Blockly.Field.register('my_field_name', myFieldClass);

Şunlara dönüşür:

Blockly.fieldRegistry.register('my_field_name', myFieldClass);

setText

setText işlevi artık Blockly çekirdeği tarafından çağrılmadığından, setText işleviniz mantık içeriyorsa setText işlevinizin tam olarak ne yaptığına bağlı olarak değer işleme işlev paketine, getText işlevine ve oluşturma işlevleri'ne taşınması gerekir.

CustomFields.UpgradeField.prototype.setText = function(newText) {
  // Do validation.
  if (typeof newText != 'string' || newText === this.text_) {
    return;
  }

  // Fire event.
  if (this.sourceBlock_ && Blockly.Events.isEnabled()) {
    Blockly.events.fire(new Blockly.Events.BlockChange(
        this.sourceBlock_, 'field', this.name, this.text_, newText
    ));
  }

  // Update text value.
  this.text_ = 'prefix' + newText;

  // Rerender.
  this.size_.width = 0;
};

Şunlara dönüşür:

CustomFields.UpgradeField.prototype.doClassValidation_ = function(newValue) {
  if (typeof newValue != 'string') {
    return null;
  }
  return newValue;
};

CustomFields.UpgradeField.prototype.getText = function() {
  return  'prefix' + this.value_;
}

Engelleme özelliği otomatik olarak işler:

  • Yeni değerin eski değerden farklı olup olmadığı kontrol ediliyor.
  • Değer güncelleniyor.
  • Değişiklik etkinliklerini tetikleme.
  • Alan yeniden oluşturuluyor.

Yapmanız gerekenler:

Önerilen yükseltmeler, alan API'sinin değiştirildiği yerlerdir ancak değişiklik yapmamayı seçerseniz alanınız büyük olasılıkla çalışmaya devam eder.

SERİ KULLANILABİLİR

EDITABLE ve SERIALIZABLE özellikleri hakkında daha fazla bilgi için Düzenlenebilir ve serileştirilebilir özellikler konusuna bakın.

CustomFields.UpgradeField.prototype.SERIALIZABLE = true;

Aşağıdaki uyarı göz ardı edilebilir ancak SERIALIZABLE özelliğini tanımlayarak bu sorunu çözebilirsiniz:

Detected an editable field that was not serializable. Please define
SERIALIZABLE property as true on all editable custom fields. Proceeding
with serialization.

Yukarıdaki uyarı, Blockly'nin alanın serileştirilmesini istediğinize inandığı (EDITABLE özelliği doğru olduğu için) ancak SERIALIZABLE özelliğini tanımlayana kadar emin olamayacağınız anlamına gelir. Bu metni olduğu gibi bırakmayı seçerseniz her şey düzgün çalışır ve alanınız seri hale getirilir ancak konsol uyarıları alırsınız.

size_.width

this.size_.width = 0;

Şunlara dönüşür:

this.isDirty_ = true;

Aşağıdaki uyarı göz ardı edilebilir ancak size_.width özelliği yerine isDirty_ özelliğini ayarlayarak bu sorunu çözebilirsiniz:

Deprecated use of setting size_.width to 0 to rerender a field. Set
field.isDirty_ to true instead.

Yukarıdaki uyarı, Blockly'nin bir alanı yeniden oluşturmak için eski bir yöntem kullandığınızı ve yeni yöntemi kullanmanızı istediği anlamına gelir.

isDirty_ özelliği hakkında daha fazla bilgi için isDirty_ konusuna bakın.

init

init işlevi, alt sınıflarda yinelenen kodu azaltmak için bir şablon işlevi haline getirilmiştir.

CustomFields.UpgradeField.prototype.init = function() {
  if (this.fieldGroup_) {
    // Already initialized once.
    return;
  }

  // Call superclass.
  CustomFields.UpgradeField.superClass_.init.call(this);

  // Create DOM elements.
  this.extraDom_ = Blockly.utils.dom.createSvgElement('image',
      {
        'height': '10px',
        'width': '10px'
      });
  this.extraDom_.setAttributeNS('http://www.w3.org/1999/xlink',
      'xlink:href', 'image.svg');
  this.extraDom_.style.cursor = 'pointer';
  this.fieldGroup_.appendChild(this.extraDom_);

  // Bind events.
  this.mouseOverWrapper_ =
    Blockly.browserEvents.bind(
        this.getClickTarget_(), 'mouseover', this, this.onMouseOver_);
  this.mouseOutWrapper_ =
    Blockly.browserEvents.bind(
        this.getClickTarget_(), 'mouseout', this, this.onMouseOut_);

  // Render.
  this.setValue(this.getValue());
};

Şunlara dönüşür:

CustomFields.UpgradeField.prototype.initView = function() {
  CustomFields.UpgradeField.superClass_.initView.call(this);

  this.extraDom_ = Blockly.utils.dom.createSvgElement('image',
      {
        'height': '10px',
        'width': '10px'
      });
  this.extraDom_.setAttributeNS('http://www.w3.org/1999/xlink',
      'xlink:href', 'image.svg');
  this.extraDom_.style.cursor = 'pointer';
  this.fieldGroup_.appendChild(this.extraDom_);
};

CustomFields.UpgradeField.prototype.bindEvents_ = function() {
  CustomFields.UpgradeField.superClass_.bindEvents_.call(this);

  this.mouseOverWrapper_ =
    Blockly.bindEvent_(
        this.getClickTarget_(), 'mouseover', this, this.onMouseOver_);
  this.mouseOutWrapper_ =
    Blockly.bindEvent_(
        this.getClickTarget_(), 'mouseout', this, this.onMouseOut_);
};

Bu, engelleme modunda artık aşağıdakilerin otomatik olarak işlendiği anlamına gelir:

  • Alanın önceden başlatılıp başlatılmadığı kontrol ediliyor.
  • fieldGroup_ oluşturuluyor.
  • Alan oluşturuluyor.
  • Bağlama ipucu ve düzenleyici etkinliklerini göster.

Yapmanız gerekenler:

onMouseDown_

CustomFields.UpgradeField.prototype.onMouseDown_ = function(e) {
  // ...
};

Şunlara dönüşür:

CustomFields.UpgradeField.prototype.showEditor_ = function() {
  // ...
}

Fare tıklamalarını işlemek için onMouseDown_ işlevi yerine, showEditor_ işlevini geçersiz kılmanızı öneririz. Bu işlev, girişin hareket sisteminden geçmesine izin verir.

Düzenleyiciler hakkında daha fazla bilgi için Düzenleyenler konusuna bakın.

setValue

setValue işlevi artık alt sınıflarda yinelenen kodu azaltmak için bir şablon işlevidir. setValue işleviniz mantık içeriyorsa bunu Değer işleme bölümünde açıklanan değer işleme yollarına uyacak şekilde yeniden düzenlemeyi düşünebilirsiniz.

text_

Alanınızın text_ özelliğine hiçbir zaman doğrudan erişmemenizi veya bu özelliği güncellememenizi öneririz. Bunun yerine, alanınızın kullanıcı tarafından okunabilen metnine erişmek için getText işlevini, alanınızın depolanan değerini güncellemek için setValue işlevini kullanın.

Bir alanın değeri ve metniyle ilgili daha fazla bilgi için Bir alanın anatomisi bölümüne bakın.

Yükseltmeyle ilgili yardım alma

Sağlanması gerekenler

Yardım isterken belirli sorular sormak en iyisidir:

Önerilmez: "Bu alandaki sorun ne?"

"Bu alanı yükseltmeme yardım et" seçeneği de önerilmez.

Önerilen: "Alan metni düzgün bir şekilde güncellenmiyor."

Size yardımcı olan kişilere kaynak da sağlamanız gerekir. Bu dosyaları diğer kullanıcılar kolayca kullanabilir.

Önerilmez:

  • Kod görselleri.
  • Eksik kod.

Önerilen:

  • Alan kodunu metin biçiminde tamamlayın.
  • Kötü alan davranışıyla ilgili GIF resimleri.
  • Kötü alan davranışını yeniden oluşturmaya yönelik adımlar.
  • Yükseltmenin yapmakta olduğunuz engelleme sürümü.

Yayınlanacağı yer

Yeni sürüme geçmeyle ilgili soruları engellenmiş geliştirici forumunda yayınlayın.

Sorunun bloklu çekirdekle ilgili bir sorun olduğundan eminseniz bloklu GitHub'da da sorun yayınlayabilirsiniz. Bir sorunu yayınlamaya karar verirseniz lütfen istenen tüm bilgileri doldurun.