保存并加载图标

一些图标具有需要保存的状态,而其他图标则基于现有状态进行实例化。例如,注释图标需要保存其文本,而警告图标不需要保存文本,因为它们是根据块的连接方式进行实例化的。

如果图标需要保存其状态,您需要实现 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);