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

プロシージャは、すべての参照バッキング データモデルをブロックします。参照するバッキング データモデルは、 プロシージャ(名前、パラメータ、リターン)。Google Cloud で提供されるデータモデルは、 @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...
}

変更をトリガーする

プロシージャ モデルの変更をトリガーするメソッドでは、次の呼び出しも行う必要があります。 次の場所から triggerProceduresUpdate: @blockly/block-shareable-procedures プラグイン。これにより、 プロシージャ ブロックで 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...
}