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