カスタム フィールドのアップグレード

2019 年 7 月(リリース 2.20190722) より体系化されたフィールド API が追加されました。目的 下位互換性を維持する必要があります。つまり、以前に作成した カスタム フィールドを使用して、引き続き機能します。 カスタム フィールドをアップグレードする必要があるかどうかを決定する前に、 [危険性のあるエリア] で確認し、フィールドで徹底的なテストを行います。

2019 年 7 月までは項目間の標準化がなかったため デベロッパーが行う必要がある変更をすべてカバーするのは困難です。 このドキュメントでは、発生する可能性のある変更をすべて網羅するように努めていますが、このドキュメントに 関心がある内容については、 アップグレードのサポートを利用する

危険地域

危険エリアは API が変更された既知の場所であり、フィールドが あります。

Blockly.Field.register

フィールドが Blockly.Field.register(); で登録されなくなりました。Google 登録を処理する fieldRegistry 名前空間になりました。

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 プロパティが true であるため)に、フィールドをシリアル化しますが、 SERIALIZABLE プロパティを定義するまでは確定できません。次のオプションを選択した場合: このまま放置しておくと、すべてが正しく機能し、フィールドが コンソールに警告が表示されます。

size_.width

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() {
  // ...
}

showEditor_ 関数をオーバーライドして、マウスを処理することをおすすめします。 入力を渡すことができるため、onMouseDown_ 関数ではなくクリックを使用する 操作することもできます。

エディタの詳細については、エディタをご覧ください。

setValue

setValue 関数がテンプレートに 関数を サブクラス内の重複コードを減らしますsetValue 関数にロジックが含まれている場合、 次のモジュールで説明した値処理パスに適合するようにリファクタリングすることを検討します。 値の処理

text_

サイトの text_ プロパティにアクセスしたり、更新したりすることはおすすめしません。 フィールドを直接指定します。代わりに、 getText 関数 ユーザーが読むことができるフィールドのテキストと setValue 関数 フィールドの格納値を更新します

フィールドの値とテキストの詳細については、以下をご覧ください。 フィールドの構造

アップグレードに関するサポートを利用する

提供内容

サポートを依頼する際は、以下の具体的な質問をすることをおすすめします。

非推奨: 「このフィールドの問題点」

推奨されません: 「このフィールドのアップグレードを手伝って」

推奨: 「フィールド テキストが正しく更新されていません。」

また、組織をサポートする人々にリソースを提供する必要もあります。これらの 他のユーザーも簡単に使えるようにする必要があります。

非推奨の方法:

  • コードのイメージ。
  • コードが不完全です。

推奨:

  • テキスト形式のフィールド コードを完成させます。
  • フィールドの不正な動作を示す GIF 画像。
  • 不正なフィールドの動作を再現する手順。
  • アップグレード元の Blockly のバージョン。

投稿場所

移行の妨げになるデベロッパーについてアップグレードに関する質問を投稿する フォーラムをご覧ください。

Blockly コアに問題があることがわかっている場合は、 問題を投稿する 公開されています。問題を投稿する場合は、すべての 提供します。