Per alcune icone è necessario salvare uno stato, mentre per altre viene creato un'istanza in base allo stato esistente. Ad esempio, le icone dei commenti devono salvare il testo, mentre le icone di avviso no perché vengono create in base al modo in cui sono collegati i blocchi.
Se l'icona deve salvare il proprio stato, devi implementare l'interfaccia ISerializable
e register la tua icona.
Lo stato restituito dall'icona viene incluso nella proprietà icons
dello
stato del blocco:
{
'blocks': {
'languageVersion': 0,
'blocks': [
{
'type': 'my_block',
'icons': {
// Your state goes here!
'my_icon': 'some state',
}
}
]
}
}
Salva stato
Per salvare lo stato dell'icona, devi implementare il metodo saveState
dell'interfaccia ISerializable
. Questo metodo può restituire un json arbitrario, che viene trasmesso al tuo metodo loadState
.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
Serializzazione e backup completi dei dati
saveState
riceve anche un parametro doFullSerialization
facoltativo. Viene utilizzato da icone che fanno riferimento allo stato serializzato da un diverso serializzatore (come modelli di dati di supporto). Il parametro indica che lo stato di riferimento non sarà disponibile quando il blocco viene deserializzato, quindi l'icona deve serializzare tutto lo stato di supporto. Ad esempio, questo avviene quando un singolo blocco viene serializzato o quando un blocco viene copiato e incollato.
Ecco due casi d'uso comuni:
- Quando un singolo blocco viene caricato in un'area di lavoro in cui il modello dei dati di supporto non esiste, l'icona nel suo stato contiene informazioni sufficienti a creare un nuovo modello dei dati.
- Quando un blocco viene copiato e incollato, l'icona crea sempre un nuovo modello di dati di supporto invece di fare riferimento a uno esistente.
Stato di caricamento
Per salvare lo stato dell'icona, devi implementare il metodo loadState
dell'interfaccia ISerializable
. Questo metodo acquisisce il JSON restituito dal metodo saveState
.
loadState(state) {
this.state = state;
}
Registra classi di icone
Infine, devi registrare l'icona in modo che il sistema
di serializzazione possa confermarla. Ricorda che la stringa IconType
utilizzata per registrare l'icona
deve avere la stessa stringa di quella restituita dal relativo metodo
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);