在设计应用时,有多种范例可供选择 它使用 Blockly。在选择目标时, 因为它们会影响用户需要的屏蔽设置
配置
许多 Blockly 应用都用于描述配置, 与可执行程序相比配置应用通常从 在工作区上初始化一个根级块。一个很好的例子是 Blockly 开发者工具的“Block Factory”标签页:
Blockly.Blocks['factory_base'] = {
init: function() {
this.setDeletable(false);
this.setMovable(false);
this.setEditable(false);
// etc...
}
}
Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);
这会创建一个无法删除、无法移动的块,用于存放所有 用户的配置。工作区可能会随时序列化 以确定当前配置。
此类应用可能希望自动停用任何 连接到根代码块。只需一行代码即可完成上述操作:
workspace.addChangeListener(Blockly.Events.disableOrphans);
串行程序
大多数 Blockly 应用都用于创建 计划。用户将按顺序执行的块堆叠在一起。
工作区上的每个(未停用)块都将成为 计划。如果存在多个块堆叠,则位置较高的块 先执行代码。(如果两个堆栈的高度大致相同, 左侧(RTL 模式下为右侧)的堆栈具有优先权。)
您可以随时将工作区导出到可执行代码。此代码 可在客户端用 JavaScript 执行(使用 eval 或 JS 口译)或服务器端。
import {javascriptGenerator} from 'blockly/javascript';
var code = javascriptGenerator.workspaceToCode(workspace);
并行程序
有些 Blockly 应用选择 而非串行。例如,一款音乐应用 鼓循环与旋律同时进行
实现并行执行的一种方法是为每个 逐个屏蔽:
import {javascriptGenerator} from 'blockly/javascript';
var json = Blockly.serialization.workspaces.save(workspace);
// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice(); // Create shallow copy.
blocks.length = 0;
// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
var block = topBlocks[i];
blocks.push(block);
Blockly.serialization.workspaces.load(json, headless);
allCode.push(javascriptGenerator.workspaceToCode(headless));
blocks.length = 0;
}
如果目标语言是 JavaScript,则 allCode
数组可以是
用于创建多个 JS 解释器以便同时执行。如果
目标语言类似于 Python,则 allCode
数组
可以汇编为使用线程模块的单个程序。
与任何并行程序一样,在 任何共享资源,例如变量和函数。
事件驱动的程序
事件处理脚本只是由系统调用的函数, 比程序本身更复杂这些区块可以将一组 要执行的代码块,也可以是位于堆栈顶部的标头 一组数据。
有些开发者喜欢在放在事件块顶部
它们看起来与其他版块不同这不是的默认外观
阻塞,但可以通过替换渲染程序常量添加
ADD_START_HATS
到 true
(“自定义渲染程序”Codelab - 替换常量)。
或者添加主题并在方块样式上设置帽子选项。更多
如需了解如何将方块作为主题的一部分来设置帽子,请参阅
此处。
在事件驱动型模型中,可能还需要创建一个处理程序 。在此模型下,工作区上的任何砌块 事件处理脚本,则会被忽略,且不会执行。
在设计使用事件的系统时,请考虑它是否 可能或需要支持同一事件的多个实例 处理程序。