Создание пользовательских моделей данных процедур

Процедурные блоки содержат все справочные модели данных, определяющие сигнатуру процедуры (имя, параметры и возвращаемое значение). Модели данных, предоставляемые плагином @blockly/block-shareable-procedures, созданы для копирования поведения устаревших встроенных процедурных блоков Blockly.

Сюда входит некоторое поведение, которое вам может не понадобиться для ваших пользовательских блоков процедур, в том числе:

  • Типы возвращаемых данных не поддерживаются.
  • Все параметры связаны с глобальной переменной

Если вам требуется иное поведение, вы можете создать собственные модели данных процедур.

Реализация модели процедуры

Ваша модель данных процедуры должна реализовывать интерфейс IProcedureModel .

class MyProcedureModel {
  constructor(workspace, name, id) {
    this.workspace = workspace;
    this.name = name;
    this.id = id;

    // Note: construction should not add the model to the procedure map.
  },

  // Other methods are omitted for brevity...
}

Реализация модели параметров

Ваша модель данных параметров должна реализовывать интерфейс IParameterModel .

class MyParameterModel {
  constructor(workspace, name, id) {
    this.workspace = workspace;
    this.name = name;
    this.id = id;
  },

  setProcedureModel(model) {
    this.model =  model;
    return this;
  }

  // Other methods are omitted for brevity...
}

Изменения триггера

Любой метод, инициирующий изменения в процедурной модели, также должен вызывать triggerProceduresUpdate из плагина @blockly/block-shareable-procedures . Это приведёт к вызову doProcedureUpdate для всех процедурных блоков, что приведёт к их повторной отрисовке.

import {triggerProceduresUpdate} from '@blockly/block-shareable-procedures';

class MyProcedureModel {
  setName(name) {
    this.name = name;
    triggerProcedureUpdate();
    return this;
  }

  // Other methods are omitted for brevity...
}

class MyParameterModel {
  setName(name) {
    this.name = name;
    triggerProcedureUpdate();
    return this;
  }

  // Other methods are omitted for brevity...
}

События

Модели процедур в плагине @blockly/block-shareable-procedures также запускают события при изменении процедур. Это позволяет синхронизировать несколько рабочих областей и использовать модели процедур в них совместно. Вы также можете запускать события по своему усмотрению.

Десериализация

Каждому вашему классу также необходим static loadState для поддержки десериализации.

class MyProcedureModel {
  static loadState(state, workspace) {
    // Note that the procedure model should not deserialize parameters.
    // The deserializer will handle that.
    return new MyProcedureModel(workspace, state.name, state.id);
  }

  // Other methods are omitted for brevity...
}

class MyParameterModel {
  static loadState(state, workspace) {
    return new MyParameterModel(workspace, state.name, state.id);
  }

  // Other methods are omitted for brevity...
}