程序會參照所有定義程序簽章 (名稱、參數和傳回) 的支援資料模型。@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...
}
