儲存並載入圖示

部分圖示含有需要儲存的狀態,其他圖示則會根據現有狀態例項化。例如,註解圖示需儲存文字,而警告圖示則不會因為會根據連線區塊的方式將圖示執行個體化。

如果您的圖示需要儲存狀態,您必須實作 ISerializable 介面並register圖示。

圖示傳回的狀態會包含在區塊狀態的 icons 屬性中:

{
  'blocks': {
    'languageVersion': 0,
    'blocks': [
      {
        'type': 'my_block',
        'icons': {
          // Your state goes here!
          'my_icon': 'some state',
        }
      }
    ]
  }
}

儲存狀態

如要儲存圖示的狀態,您必須實作 ISerializable 介面的 saveState 方法。這個方法可傳回任意 JSON,並傳遞至 loadState 方法。

saveState() {
  return this.state;  // Some arbirtary JSON-compatible data.
}

完整序列化與備份資料

saveState 也會收到選用的 doFullSerialization 參數。此類型可用於參照不同序列化程式 (例如備份資料模型) 序列化狀態的圖示。當區塊去序列化時,參數表示參照狀態將無法使用,因此圖示應將所有備份狀態本身序列化。例如,在個別區塊序列化或複製區塊時,情況都是如此。

有兩種常見用途:

  • 如果將個別區塊載入的工作區不存在備份資料模型,該圖示本身的狀態就會有足夠的資訊來建立新的資料模型。
  • 複製區塊時,圖示一律會建立新的支援資料模型,而非參照現有的模型。

載入狀態

如要儲存圖示的狀態,您必須實作 ISerializable 介面的 loadState 方法。這個方法採用 saveState 方法傳回的 JSON。

loadState(state) {
  this.state = state;
}

註冊圖示類別

最後,您必須註冊圖示,讓序列化系統執行個體化。請注意,用於註冊圖示的 IconType 必須與 getType 方法傳回的字串相同。

class myIcon extends Blockly.icons.Icon {
  getType() {
    return new Blockly.icons.IconType('my_icon');
  }
}

Blockly.icons.registry.register(
    new Blockly.icons.IconType('my_icon'), myIcon);