保存する必要のある状態を持つアイコンもあれば、既存の状態に基づいてインスタンス化されるアイコンもあります。たとえば、コメント アイコンはテキストを保存する必要がありますが、警告アイコンはブロックの接続方法に基づいてインスタンス化されるため、保存する必要はありません。
アイコンの状態を保存する必要がある場合は、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
パラメータも受け取ります。これは、別のシリアライザ(バッキング データモデルなど)によってシリアル化された状態を参照するアイコンで使用されます。パラメータは、ブロックのシリアル化解除時に参照された状態が利用できないことを通知します。したがって、アイコンはすべてのバッキング状態自体をシリアル化する必要があります。たとえば、個々のブロックがシリアル化される場合や、ブロックがコピー&ペーストされる場合に当てはまります。
これには、次の 2 つの一般的なユースケースがあります。
- 個々のブロックが、バッキング データモデルが存在しないワークスペースに読み込まれると、アイコン自体の状態で、新しいデータモデルを作成するために十分な情報が保持されます。
- ブロックがコピー&ペーストされると、アイコンは既存のデータモデルを参照するのではなく、常に新しいバッキング データモデルを作成します。
読み込み状態
アイコンの状態を保存するには、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);