如何在 Blockly 中渲染一个块?

How to render a block in Blockly?

我浏览了 Workspace 文档并尝试使用 newBlock 方法,如下所示:

var block = workspace.newBlock("string_length") 添加一个定义如下的自定义块:

Blockly.Blocks['string_length'] = {
  init: function() {
    this.jsonInit({
      "message0": 'length of %1',
      "args0": [
        {
          "type": "input_value",
          "name": "VALUE",
          "check": "String"
        }
      ],
      "output": "Number",
      "colour": 160,
      "tooltip": "Returns number of letters in the provided text.",
      "helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"
    });
  }
};

当无法识别块原型名称但它似乎可以识别并分配其唯一 ID 和其他信息时,Blockly 往往会抛出异常。

即使在尝试将其添加到 topblocks 后,该块还是不可见。

手动添加块时,您必须经过一定的过程。

确保块已正确添加,这意味着 block = workspace.newBlock("your_type") 不会引发错误并且块已初始化。

接下来你必须调用 block.initSvg() 函数,文档说你必须调用 initSvg()initModel() 函数:

Call initModel on all fields on the block. May be called more than once. Either initModel or initSvg must be called after creating a block and before the first interaction with it. Interactions include UI actions (e.g. clicking and dragging) and firing events (e.g. create, delete, and change).

但是 initModel() 函数似乎给我带来了与我尚未初始化时相同的错误,据我所知,文档也没有明确区分两者。

调用 initSvg() 函数后,您应该能够通过在 workspace 对象上调用 .render() 来渲染所需的块。

来源:

Block documentation

Workspace documentation