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