Расширенная настройка

Blockly позволяет настраивать определенные функции путем замены соответствующих классов Blockly.

Заменяемые классы

Следующие блочные классы могут быть заменены:

Блочный класс Интерфейс Имя типа реестра
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 --

Информацию о замене рендерера см. в разделе Создание пользовательских рендереров .

Создать заменяющий класс

Чтобы создать заменяющий класс, реализуйте функции в соответствующем интерфейсе. Вы можете реализовать все эти функции в новом классе или расширить класс Blockly и переопределить только те функции, которые хотите изменить. Единственное требование — реализация всех функций в интерфейсе (или базового класса) и соблюдение всех требований, описанных в комментариях к интерфейсу.

Чтобы указать средству проверки типов, что вы реализуете определенный интерфейс, аннотируйте свой класс тегом JSDoc @implements {InterfaceName} (в JavaScript) или ключевым словом implements (в TypeScript).

Расскажите Blockly о вашем заменяющем классе

Сообщить Blockly о заменяемом классе можно двумя способами: зарегистрировать его как класс по умолчанию для своего типа (предпочтительно) или внедрить его с помощью параметра конфигурации plugins .

Зарегистрируйте свой заменяющий класс как класс по умолчанию

Предпочтительный способ сообщить Blockly о вашем замещающем классе — зарегистрировать его как класс по умолчанию для этого типа. Для этого вызовите Blockly.registry.register , используя имя Blockly.registry.DEFAULT , и установите параметр opt_allowOverrides в true .

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

Введите ваш заменяющий класс

Вы также можете внедрять замещающие классы с помощью параметра конфигурации plugins . Это объект, который использует имена типов реестра в качестве имён свойств, а замещающие классы или зарегистрированные имена — в качестве значений свойств.

(Несмотря на имя свойства plugins , ваш класс не нужно упаковывать и распространять через npm, как плагины, используемые для расширения Blockly .)

Либо передайте ваш заменяющий класс в Blockly.inject :

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

Или зарегистрируйте свой класс с помощью Blockly.registry.register и передайте зарегистрированное имя в Blockly.inject . Это полезно, если вы храните параметры конфигурации в формате JSON.

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

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