ارتقاء یک فیلد سفارشی

در جولای 2019 ( نسخه 2.20190722 ) API فیلدهای مدون بیشتری اضافه شد. در نظر گرفته شده است که تا حد امکان با عقب سازگار باشد. این بدان معناست که اگر قبل از جولای 2019 یک فیلد سفارشی ایجاد کرده باشید، به احتمال زیاد به کار خود ادامه خواهد داد. قبل از تصمیم گیری در مورد اینکه آیا فیلد سفارشی شما نیاز به ارتقاء دارد یا خیر، باید قسمت Danger area را بخوانید و زمینه خود را به طور کامل آزمایش کنید.

از آنجایی که قبل از ژوئیه 2019 بین فیلدها استانداردسازی وجود نداشت، پوشش همه تغییراتی که ممکن است یک توسعه‌دهنده نیاز به انجام آن داشته باشد دشوار است. این سند سعی می‌کند تمام تغییرات احتمالی را پوشش دهد، اما اگر این سند چیزی که به آن علاقه دارید را پوشش نمی‌دهد، لطفاً بخش دریافت کمک ارتقا را بخوانید.

مناطق خطرناک

مناطق خطرناک مکان‌های شناخته‌شده‌ای هستند که API در آن‌ها تغییر کرده است و زمینه شما ممکن است شکسته شود.

Blockly.Field.Register

فیلدها دیگر از طریق Blockly.Field.register(); . اکنون یک فضای نام فیلدRegistry وجود دارد که ثبت نام را مدیریت می کند.

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

تبدیل می شود:

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

setText

تابع setText دیگر توسط هسته Blockly فراخوانی نمی‌شود، بنابراین اگر تابع setText شما دارای منطق باشد، باید به مجموعه توابع مدیریت ارزش ، تابع getText و توابع رندر منتقل شود (بسته به اینکه تابع setText دقیقاً چیست. در حال انجام).

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;
};

تبدیل می شود:

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

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

Blockly به طور خودکار کنترل می کند:

  • بررسی اینکه آیا مقدار جدید با مقدار قبلی متفاوت است یا خیر.
  • به روز رسانی مقدار
  • شلیک رویدادهای تغییر.
  • بازپرداخت فیلد.

شما باید رسیدگی کنید:

به روز رسانی های توصیه شده مکان هایی هستند که API فیلد تغییر کرده است، اما اگر تغییری ایجاد نکنید، به احتمال زیاد زمینه شما همچنان کار می کند.

قابل سریال سازی

برای اطلاعات بیشتر در مورد ویژگی‌های EDITABLE و SERIALIZABLE به ویژگی‌های قابل ویرایش و سریال‌سازی مراجعه کنید.

CustomFields.UpgradeField.prototype.SERIALIZABLE = true;

اخطار زیر قابل توجه نیست، اما می توانید با تعریف ویژگی SERIALIZABLE آن را حل کنید:

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

اخطار بالا به این معنی است که Blockly معتقد است که می خواهید فیلد سریال شود (زیرا ویژگی EDITABLE درست است)، اما تا زمانی که ویژگی SERIALIZABLE را تعریف نکنید نمی توانید مطمئن باشید. اگر بخواهید این کار را به حال خود رها کنید، همه چیز به درستی کار می کند و فیلد شما سریال می شود، اما هشدارهای کنسول را دریافت خواهید کرد.

اندازه_.عرض

this.size_.width = 0;

تبدیل می شود:

this.isDirty_ = true;

هشدار زیر قابل توجه نیست، اما می‌توانید با تنظیم ویژگی isDirty_ به جای ویژگی size_.width ، آن را حل کنید:

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

اخطار بالا به این معنی است که Blockly تشخیص داده است که شما از یک روش قدیمی برای رندر مجدد یک فیلد استفاده می کنید و مایل است از روش جدید استفاده کنید.

برای اطلاعات بیشتر در مورد ویژگی isDirty_ isDirty_ را ببینید.

init

تابع init به یک تابع الگو تبدیل شده است تا کدهای تکراری را در زیر کلاس ها کاهش دهد.

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());
};

تبدیل می شود:

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_);
};

این بدان معنی است که blockly اکنون به طور خودکار کنترل می کند:

  • بررسی اینکه آیا فیلد از قبل مقداردهی اولیه شده است.
  • ایجاد fieldGroup_ .
  • رندر کردن زمینه.
  • نکته ابزار صحافی و نمایش رویدادهای ویرایشگر.

شما باید رسیدگی کنید:

onMouseDown_

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

تبدیل می شود:

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

توصیه می‌کنیم برای مدیریت کلیک‌های ماوس، به جای عملکرد onMouseDown_ تابع showEditor_ را نادیده بگیرید، زیرا اجازه می‌دهد ورودی از طریق سیستم حرکتی عبور کند.

برای اطلاعات بیشتر در مورد ویرایشگرها به ویرایشگرها مراجعه کنید.

setValue

تابع setValue اکنون یک تابع الگو برای کاهش کدهای تکراری در کلاس‌های فرعی است. اگر تابع setValue شما حاوی منطق است، آن را به گونه‌ای که با مسیرهای مدیریت ارزش توضیح داده شده در Value handling مطابقت داشته باشد، دوباره فاکتور کنید.

متن_

توصیه می کنیم هرگز مستقیماً به ویژگی text_ فیلد خود دسترسی نداشته باشید یا آن را به روز نکنید. در عوض، از تابع getText برای دسترسی به متن قابل خواندن توسط کاربر فیلد خود و تابع setValue برای به روز رسانی مقدار ذخیره شده فیلد خود استفاده کنید.

برای اطلاعات بیشتر در مورد مقدار یک فیلد در مقابل متن آن به آناتومی یک فیلد مراجعه کنید.

دریافت کمک ارتقا

چه چیزی ارائه شود

هنگام درخواست کمک، بهتر است سؤالات خاصی بپرسید:

توصیه نمی شود: "این زمینه چه مشکلی دارد؟"

همچنین توصیه نمی شود: "به من در ارتقاء این فیلد کمک کنید."

توصیه می شود: "متن فیلد به درستی به روز نمی شود."

همچنین لازم است منابعی را در اختیار افرادی قرار دهید که به شما کمک می کنند. استفاده از این فایل ها برای دیگران باید آسان باشد.

توصیه نمیشود:

  • تصاویر کد
  • کد ناقص

توصیه شده:

  • کد فیلد را در قالب متن کامل کنید.
  • تصاویر گیف رفتار میدانی بد.
  • مراحل بازتولید رفتار بد میدانی
  • نسخه blockly که از آن ارتقا می دهید.

کجا پست کنیم

سوالات ارتقاء را در انجمن توسعه دهندگان مسدود ارسال کنید.

اگر مطمئن هستید که مشکل مربوط به هسته بلاکی است، می توانید مشکلی را در GitHub مسدود شده نیز ارسال کنید . اگر تصمیم دارید مشکلی را پست کنید، لطفاً تمام اطلاعات درخواستی را پر کنید.