一些图标具有需要保存的状态,而其他图标则基于现有状态进行实例化。例如,注释图标需要保存其文本,而警告图标不需要保存文本,因为它们是根据块的连接方式进行实例化的。
如果图标需要保存其状态,您需要实现 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);