# 保存和加载图标

有些图标有需要持久化的状态,也有些图标是根据已有状态自动创建的。比如注释图标需要保存文本,而警告图标通常不需要,因为它会根据块连接关系自动生成。

如果图标需要保存状态,就要实现 ISerializable 接口,并且注册图标类

图标返回的状态会写入块状态中的 icons 字段:

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

重要

自定义图标的保存与加载仅支持新的 JSON 序列化系统,不支持旧的 XML 序列化系统。

# 保存状态

要保存图标状态,需要实现 ISerializablesaveState 方法。该方法可以返回任意 JSON 兼容数据,后续会传给 loadState

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

# 完整序列化与后备数据

saveState 还会接收可选参数 doFullSerialization。当图标依赖于由其他序列化器保存的状态(例如后备数据模型)时,会用到这个参数。它表示反序列化时这些被引用状态不可用,因此图标需要把后备状态本身完整序列化进去。

典型场景包括:

  • 单独加载某个块到工作区时,如果对应后备数据模型不存在,图标可凭自身状态创建新的数据模型。
  • 块复制粘贴时,图标总是创建新的后备数据模型,而不是引用旧模型。

# 加载状态

要加载图标状态,需要实现 ISerializableloadState 方法。该方法接收 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);