部分圖示含有需要儲存的狀態,其他圖示則會根據現有狀態例項化。例如,註解圖示需儲存文字,而警告圖示則不會因為會根據連線區塊的方式將圖示執行個體化。
如果您的圖示需要儲存狀態,您必須實作 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);