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