Cómo extender un campo existente

Para extender un campo existente, debes crear una subclase de un campo integrado (p. ej., FieldTextInput y FieldColour) y, luego, modificar parte de él para que se adapte a tus necesidades. Estas son algunas de las partes de un campo que puedes modificar:

Si deseas crear un campo personalizado que no necesite el comportamiento de ningún campo integrado, debes crear una subclase Field.

Extensiones comunes

La mayoría de los campos personalizados extienden uno de estos tres tipos:

  • Entrada de texto: Si quieres que los usuarios escriban en tu campo, debes extender FieldTextInput.
  • Number: Si quieres almacenar un número, debes extender FieldNumber.
  • Menú desplegable: Si deseas crear un menú desplegable, pero quieres que almacene un modelo diferente al predeterminado de la cadena o la imagen, debes extender FieldDropdown.
    • Precaución: Antes de extender FieldDropdown, verifica que las opciones de personalización del campo desplegable no satisfagan tus necesidades.

En ciertas circunstancias, es posible que desees extender un tipo de campo diferente. Por ejemplo, FieldLabelSerializable extiende FieldLabel.

Subclase

import * as Blockly from 'blockly';

export class MyCustomTextField extends Blockly.FieldTextInput {

  constructor(value, validator, config) {
    super(value, validator, config);
  }
}

El constructor de la subclase de un campo es muy similar al constructor de un campo personalizado. Por lo general, la firma del subconstructor debe coincidir con la firma del superconstructor.

JSON y registro

También debes registrar el campo una vez:

Blockly.fieldRegistry.register('my_custom_text_field', MyCustomTextField);

y proporciona una implementación de fromJson en la clase para que funcione con el formato JSON:

static fromJson(options) {
  const value = Blockly.utils.parsing.replaceMessageReferences(options.value);
  return new MySubclassName(value);
}

Para obtener más información sobre el registro de un campo, consulta la sección JSON y registro en Cómo crear un campo personalizado.