プロシージャは、プロシージャのシグネチャ(名前、パラメータ、戻り値)を定義するすべての参照元データモデルをブロックします。@blockly/block-shareable-procedures プラグインで提供されるデータモデルは、Blockly の以前の組み込みプロシージャ ブロックの動作を複製するように構築されています。
これには、カスタム プロシージャ ブロックで望ましくない動作も含まれます。たとえば、次のような動作です。
- 戻り値の型はサポートされていません
- すべてのパラメータはグローバル変数に関連付けられています
異なる動作が必要な場合は、独自のカスタム プロシージャ データモデルを作成できます。
プロシージャ モデルの実装
プロシージャ データモデルは、IProcedureModel インターフェースを実装する必要があります。
class MyProcedureModel {
  constructor(workspace, name, id) {
    this.workspace = workspace;
    this.name = name;
    this.id = id;
    // Note: construction should not add the model to the procedure map.
  },
  // Other methods are omitted for brevity...
}
パラメータ モデルの実装
パラメータ データモデルは、IParameterModel インターフェースを実装する必要があります。
class MyParameterModel {
  constructor(workspace, name, id) {
    this.workspace = workspace;
    this.name = name;
    this.id = id;
  },
  setProcedureModel(model) {
    this.model =  model;
    return this;
  }
  // Other methods are omitted for brevity...
}
トリガーの変更
プロシージャ モデルの変更をトリガーするメソッドは、@blockly/block-shareable-procedures プラグインから triggerProceduresUpdate も呼び出す必要があります。これにより、すべてのプロシージャ ブロックで doProcedureUpdate が呼び出され、再レンダリングされます。
import {triggerProceduresUpdate} from '@blockly/block-shareable-procedures';
class MyProcedureModel {
  setName(name) {
    this.name = name;
    triggerProcedureUpdate();
    return this;
  }
  // Other methods are omitted for brevity...
}
class MyParameterModel {
  setName(name) {
    this.name = name;
    triggerProcedureUpdate();
    return this;
  }
  // Other methods are omitted for brevity...
}
イベント
@blockly/block-shareable-procedures プラグインの手順モデルも、手順が変更されたときにイベントを発生させます。これにより、複数のワークスペースを同期し、プロシージャ モデルを共有できます。必要に応じて、イベントを発生させることもできます。
逆シリアル化
また、各クラスには、逆シリアル化をサポートする static loadState メソッドが必要です。
class MyProcedureModel {
  static loadState(state, workspace) {
    // Note that the procedure model should not deserialize parameters.
    // The deserializer will handle that.
    return new MyProcedureModel(workspace, state.name, state.id);
  }
  // Other methods are omitted for brevity...
}
class MyParameterModel {
  static loadState(state, workspace) {
    return new MyParameterModel(workspace, state.name, state.id);
  }
  // Other methods are omitted for brevity...
}
