Personalización avanzada

Blockly te permite personalizar ciertas funciones reemplazando las clases de Blockly correspondientes.

Clases reemplazables

Se pueden reemplazar las siguientes clases de Blockly:

Clase de Blockly Interfaz Nombre del tipo de registro
Blockly.dragging.Dragger Blockly.IDragger blockDragger
Blockly.ConnectionChecker Blockly.IConnectionChecker connectionChecker
Blockly.InsertionMarkerPreviewer Blockly.IConnectionPreviewer connectionPreviewer
Blockly.HorizontalFlyout Blockly.IFlyout flyoutsHorizontalToolbox
Blockly.VerticalFlyout Blockly.IFlyout flyoutsVerticalToolbox
Blockly.MetricsManager Blockly.IMetricsManager metricsManager
Blockly.Toolbox Blockly.IToolbox toolbox
Blockly.VariableMap Blockly.IVariableMap variableMap
Blockly.VariableModel Blockly.IVariableModel --

Para obtener información sobre cómo reemplazar un renderizador, consulta Crea renderizadores personalizados.

Crea una clase de reemplazo

Para crear una clase de reemplazo, implementa las funciones en la interfaz correspondiente. Puedes implementar todas estas funciones en una clase nueva o extender la clase Blockly y anular solo las funciones que quieras cambiar. El único requisito es que tú (o la clase base) implementen todas las funciones de la interfaz y cumplan con los requisitos que se describen en los comentarios de la interfaz.

Para indicarle al verificador de tipos que implementas una interfaz específica, anota tu clase con la etiqueta @implements {InterfaceName} de JSDoc (en JavaScript) o la palabra clave implements (en TypeScript).

Informa a Blockly sobre tu clase de reemplazo

Hay dos formas de informar a Blockly sobre tu clase de reemplazo: registrarla como la clase predeterminada de su tipo (opción preferida) o insertarla con la opción de configuración plugins.

Registra tu clase de reemplazo como la predeterminada

La forma preferida de indicarle a Blockly tu clase de reemplazo es registrarla como la predeterminada para su tipo. Para ello, llama a Blockly.registry.register con el nombre Blockly.registry.DEFAULT y establece el parámetro opt_allowOverrides en true.

Blockly.registry.register(
  Blockly.registry.Type.VARIABLE_MODEL,
  Blockly.registry.DEFAULT,
  CustomVariableModel,
  true,
);

Cómo inyectar tu clase de reemplazo

También puedes insertar clases de reemplazo con la opción de configuración plugins. Es un objeto que usa nombres de tipos de registro como nombres de propiedades y clases de reemplazo o nombres registrados como valores de propiedades.

(A pesar del nombre de la propiedad plugins, tu clase no necesita empaquetarse ni distribuirse a través de npm como los complementos que se usan para extender Blockly).

Pasa tu clase de reemplazo a Blockly.inject:

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': CustomMetricsManagerClass
  }
}

También puedes registrar tu clase con Blockly.registry.register y pasar el nombre registrado a Blockly.inject. Esto es útil si almacenas tus opciones de configuración como JSON puro.

Blockly.registry.register(Blockly.registry.Type.METRICS_MANAGER, 'YOUR_NAME', CustomMetricsManagerClass);

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': 'YOUR_NAME'
  }
}