カスタム プロシージャ データモデルを作成する

プロシージャは、プロシージャのシグネチャ(名前、パラメータ、戻り値)を定義するすべての参照元データモデルをブロックします。@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...
}