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

Процедура блокирует все ссылочные модели данных, которые определяют сигнатуру процедуры (имя, параметры и возвращаемый результат). Модели данных, предоставляемые плагином @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...
}
,

Процедура блокирует все ссылочные модели данных, которые определяют сигнатуру процедуры (имя, параметры и возвращаемый результат). Модели данных, предоставляемые плагином @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...
}