Некоторые значки имеют состояние, которое необходимо сохранить, тогда как другие создаются на основе существующего состояния. Например, значки комментариев должны сохранять свой текст, а значки предупреждений — нет, поскольку их экземпляры создаются в зависимости от того, как соединены блоки.
Если вашему значку необходимо сохранить свое состояние, вам необходимо реализовать интерфейс ISerializable
и зарегистрировать свой значок.
Состояние, возвращаемое вашим значком, включается в свойство icons
состояния вашего блока:
{
'blocks': {
'languageVersion': 0,
'blocks': [
{
'type': 'my_block',
'icons': {
// Your state goes here!
'my_icon': 'some state',
}
}
]
}
}
Сохранить состояние
Чтобы сохранить состояние вашего значка, вам необходимо реализовать метод saveState
интерфейса ISerializable
. Этот метод может возвращать произвольный json, который передается в ваш метод loadState
.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
Полная сериализация и резервные данные
saveState
также получает необязательный параметр doFullSerialization
. Это используется значками, которые ссылаются на состояние, сериализованное другим сериализатором (например, резервными моделями данных). Параметр сигнализирует, что указанное состояние не будет доступно при десериализации блока, поэтому значок должен сам сериализовать все резервное состояние. Например, это справедливо при сериализации отдельного блока или при копировании блока.
Два распространенных случая использования:
- Когда отдельный блок загружается в рабочую область, где не существует базовой модели данных, значок в собственном состоянии содержит достаточно информации для создания новой модели данных.
- При копировании блока значок всегда создает новую модель данных поддержки, а не ссылается на существующую.
Состояние загрузки
Чтобы сохранить состояние вашего значка, вам необходимо реализовать метод loadState
интерфейса ISerializable
. Этот метод принимает JSON, возвращаемый вашим методом saveState
.
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);