Íconos de guardar y cargar

Algunos íconos tienen un estado que se debe guardar, mientras que otras se crean en función del estado existente. Por ejemplo, los íconos de comentarios deben guardar su texto, mientras que los íconos de advertencia no lo hacen porque se crean instancias según cómo se conectan los bloques.

Si el ícono necesita guardar su estado, debes implementar la interfaz ISerializable y register el ícono.

El estado que muestra el ícono se incluye en la propiedad icons del estado de tu bloque:

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

Guardar estado

Para guardar el estado del ícono, debes implementar el método saveState de la interfaz ISerializable. Este método puede mostrar un archivo JSON arbitrario, que se pasa a tu método loadState.

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

Serialización completa y datos de copia de seguridad

saveState también recibe un parámetro opcional doFullSerialization. Los íconos que hacen referencia al estado serializado por un serializador diferente (como modelos de datos de copia de seguridad) lo usan. El parámetro indica que el estado al que se hace referencia no estará disponible cuando se deserializa el bloque, por lo que el ícono debe serializar todo el estado de copia de seguridad. Por ejemplo, esto ocurre cuando se serializa un bloque individual o cuando se copia y pega un bloque.

Dos casos de uso comunes son los siguientes:

  • Cuando se carga un bloque individual en un lugar de trabajo en el que no existe el modelo de datos de copia de seguridad, el ícono tiene suficiente información en su propio estado para crear un modelo de datos nuevo.
  • Cuando se copia un bloque y se pega, el ícono siempre crea un nuevo modelo de datos de copia de seguridad en lugar de hacer referencia a uno existente.

Estado de carga

Para guardar el estado del ícono, debes implementar el método loadState de la interfaz ISerializable. Este método toma el JSON que muestra tu método saveState.

loadState(state) {
  this.state = state;
}

Registra clases de íconos

Por último, debes registrar tu ícono para que el sistema de serialización pueda crear una instancia de él. Recuerda que el IconType que usas para registrar el ícono debe tener la misma cadena que la que muestra su método 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);