动态类别

动态类别是指每次打开时都会根据函数动态重新填充的类别。

Blockly 支持通过注册的字符串键将类别与函数相关联,以实现此目的。该函数应返回类别内容(包括版块、按钮、标签等)的定义。内容可以指定为 JSON 或 XML,但建议使用 JSON。

另请注意,该函数会将目标工作区作为参数提供,因此动态类别中的块可以根据工作区的状态进行调整。

JSONXML
// Returns an array of objects.
var coloursFlyoutCallback = function(workspace) {
  // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
  var colourList = getPalette();
  var blockList = [];
  for (var i = 0; i < colourList.length; i++) {
    blockList.push({
      'kind': 'block',
      'type': 'colour_picker',
      'fields': {
        'COLOUR': colourList[i]
      }
    });
  }
  return blockList;
};

// Associates the function with the string 'COLOUR_PALETTE'
myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', coloursFlyoutCallback);
// Returns an arry of XML nodes.
var coloursFlyoutCallback = function(workspace) {
  // Returns an array of hex colours, e.g. ['#4286f4', '#ef0447']
  var colourList = getPalette();
  var blockList = [];
  for (var i = 0; i < colourList.length; i++) {
    var block = document.createElement('block');
    block.setAttribute('type', 'colour_picker');
    var field = document.createElement('field');
    field.setAttribute('name', 'COLOUR');
    field.innerText = colourList[i];
    block.appendChild(field);
    blockList.push(block);
  }
  return blockList;
};

// Associates the function with the string 'COLOUR_PALETTE'
myWorkspace.registerToolboxCategoryCallback(
    'COLOUR_PALETTE', coloursFlyoutCallback);

将动态类别函数与字符串键相关联(也称为注册)后,您可以将此字符串键分配给类别定义的 custom 属性,以使类别变为动态类别。

JSONXML
{
  "kind": "category",
  "name": "Colours",
  "custom": "COLOUR_PALETTE"
}
<category name="Colours" custom="COLOUR_PALETTE"></category>

内置动态类别

Blockly 提供了三个内置动态类别。

  • 'VARIABLE' 会为无类型变量创建一个类别。
  • 'VARIABLE_DYNAMIC' 会为类型化变量创建一个类别。该界面包含用于创建字符串、数字和颜色的按钮。
  • 'PROCEDURE' 会为函数块创建类别。

JSONXML
{
  "kind": "category",
  "name": "Variables",
  "custom": "VARIABLE"
},
{
  "kind": "category",
  "name": "Variables",
  "custom": "VARIABLE_DYNAMIC"
},
{
  "kind": "category",
  "name": "Functions",
  "custom": "PROCEDURE"
}
<category name="Variables" custom="VARIABLE"></category>
<category name="Variables" custom="VARIABLE_DYNAMIC"></category>
<category name="Functions" custom="PROCEDURE"></category>

注意:Blockly 代码库中使用了“过程”一词,但学生更容易理解“函数”一词。对于出现的不一致,我们深表歉意。