预设块

您可以配置(预设)工具箱中各个块的状态。例如,您可以将某个字段设置为默认值,也可以将两个块连接在一起。您还可以创建影子块,作为子块的默认值。

示例

以下是一些预设块示例。

使用预设的字段值进行屏蔽

以下是一个 math_number 块,其字段显示数字 42,而不是默认的 0:

一种数值预设为 42 的数字块。

以下是一个设置此字段的工具箱:

JSON

{
 "kind": "flyoutToolbox",
 "contents": [
   {
     "kind": "block",
     "type": "math_number",
     "fields": {
       "NUM": 42
     }
   },
 ]
}

XML

<xml id="toolbox" style="display: none">
 <block type="math_number">
   <field name="NUM">42</field>
 </block>
</xml>

预连接的块

以下是一个包含三个 math_number 块的 controls_for 块:

“从某个值到某个值(步长为某个值)的计数”块。这三个值输入连接到值为 1、10 和 1 的数字块。

以下是一个预先连接这些块的工具箱:

JSON

{
 "kind": "flyoutToolbox",
 "contents": [
   {
     "kind": "block",
     "type": "controls_for",
     "inputs": {
       "FROM": {
         "block": {
           "type": "math_number",
           "fields": {
             "NUM": 1
           }
         }
       },
       "TO": {
         "block": {
           "type": "math_number",
           "fields": {
             "NUM": 10
           }
         }
       },
       "BY": {
         "block": {
           "type": "math_number",
           "fields": {
             "NUM": 1
           }
         }
       },
     }
   },
 ]
}

XML

<xml id="toolbox" style="display: none">
 <block type="controls_for">
   <value name="FROM">
     <block type="math_number">
       <field name="NUM">1</field>
     </block>
   </value>
   <value name="TO">
     <block type="math_number">
       <field name="NUM">10</field>
     </block>
   </value>
   <value name="BY">
     <block type="math_number">
       <field name="NUM">1</field>
     </block>
   </value>
 </block>
</xml>

已停用的块

无法从工具箱中拖动已停用的块。可以使用可选的 disabled 属性单独停用块。

一个包含三个块的弹出式菜单。第三个块已停用,并显示为灰色。

JSON

{
 "kind": "flyoutToolbox",
 "contents": [
   {
     "kind": "block",
     "type":"math_number"
   },
   {
     "kind": "block",
     "type": "math_arithmetic"
   },
   {
     "kind": "block",
     "type": "math_single",
     "disabled": "true"
   }
 ]
}

XML

<xml id="toolbox" style="display: none">
 <block type="math_number"></block>
 <block type="math_arithmetic"></block>
 <block type="math_single" disabled="true"></block>
</xml>

您还可以使用 setDisabledReason 以编程方式停用或启用屏蔽。

配置屏蔽条件

您可以采用在工作区中配置代码块的任何方式,在工具箱中配置代码块。例如,您可以设置字段值、将代码块连接到值或语句输入、添加注释,以及收起或停用代码块。这是因为工具箱使用相同的代码来配置工作区用于序列化它们的块。

这也意味着可以轻松创建块配置。只需将代码块加载到工作区中,根据需要进行配置,然后在控制台中运行以下代码,即可对其进行序列化。

JSON

console.log(Blockly.serialization.workspaces.save(Blockly.getMainWorkspace()));

XML

console.log(Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()));

然后,您可以复制配置代码并将其粘贴到工具箱中。请务必移除 xyid 属性,因为这些属性会被该工具箱忽略。

可变字段

当变量字段位于工具箱中时,可能需要以不同方式指定它们,而不是在序列化时。

具体而言,当变量字段正常序列化为 JSON 时,它们仅包含所表示变量的 ID,因为变量的名称和类型是单独序列化的。不过,工具箱不包含该信息,因此需要直接将其包含在变量字段中。

{
  "kind": "flyoutToolbox",
  "content": [
    {
      "kind": "block",
      "type": "controls_for",
      "fields": {
        "VAR": {
          "name": "index",
          "type": "Number"
        }
      }
    }
  ]
}

阴影块

影子块是占位块,可执行多项功能:

  • 它们表示相应父块的默认值。
  • 用户可以直接输入值,而无需获取数字或字符串块。
  • 与常规代码块不同,如果用户将代码块放置在它们之上,它们会被替换。
  • 它们会告知用户预期值的类型。

如需创建影子块,请使用 shadow 属性 (JSON) 或 <shadow> 标记 (XML),而不是 block 属性或 <block> 标记。例如,以下 math_arithmetic 块连接了两个 math_number 影子块:

一个 `math_arithmetic` 块,其中包含两个值输入,这两个输入之间以一个运算符下拉菜单分隔,该下拉菜单中选择了加号运算符。每个值输入都包含一个阴影数字块,该块呈灰显状态,表示可以替换为另一个块。

以下是使用这些影子块的工具箱:

JSON

{
 "kind": "flyoutToolbox",
 "contents": [
   {
     "kind": "block",
     "type": "math_arithmetic",
     "fields": {
       "OP": "ADD"
     },
     "inputs": {
       "A": {
         "shadow": {
           "type": "math_number",
           "fields": {
             "NUM": 1
           }
         }
       },
       "B": {
         "shadow": {
           "type": "math_number",
           "fields": {
             "NUM": 1
           }
         }
       }
     }
   },
 ]
}

XML

<xml id="toolbox" style="display: none">
 <block type="math_arithmetic">
   <field name="OP">ADD</field>
   <value name="A">
     <shadow type="math_number">
       <field name="NUM">1</field>
     </shadow>
   </value>
   <value name="B">
     <shadow type="math_number">
       <field name="NUM">1</field>
     </shadow>
   </value>
 </block>
</xml>