自定义组成要素:屏蔽范例

在设计应用时,有多种范例可供选择 它使用 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_HATStrue“自定义渲染程序”Codelab - 替换常量)。 或者添加主题并在方块样式上设置帽子选项。更多 如需了解如何将方块作为主题的一部分来设置帽子,请参阅 此处

在事件驱动型模型中,可能还需要创建一个处理程序 。在此模型下,工作区上的任何砌块 事件处理脚本,则会被忽略,且不会执行。

在设计使用事件的系统时,请考虑它是否 可能或需要支持同一事件的多个实例 处理程序。