类型检测
Blockly的每种卡合类型(值输入/输出)都可以用类型信息标记,以便拒绝显然无效的卡合状态。这为用户提供了即时反馈,并避免了许多简单的错误。
确定数字是否为偶数的数学积木。该积木具有一个期望输入数字的输入,以及一个返回布尔值的输出。这是指定此代码的代码:
{
"type": "math_number_property",
// ...
"args0": [
// ...
{
"type": "input_value",
"name": "NUMBER_TO_CHECK",
"check": "Number"
}
],
"output": "Boolean"
}
变量
变量是重要的编程概念。Blockly支持动态类型的语言,Blockly允许定义任何类型变量,并且Blockly提供的所有生成器均适用于动态类型的语言。
访问和操作变量的最基本的积木是getter和setter积木。让我们看一下Blockly提供的getter和setter积木,也可以对getter和setter添加强制类型检查。
// Block for variable getter.
{
"type": "variables_get",
"message0": "%1",
"args0": [
{ // Beginning of the field variable dropdown
"type": "field_variable",
"name": "VAR", // Static name of the field
"variable": "%{BKY_VARIABLES_DEFAULT_NAME}" // Given at runtime
} // End of the field variable dropdown
],
"output": null, // Null means the return value can be of any type
...
},
// Block for variable setter.
{
"type": "variables_set",
"message0": "%{BKY_VARIABLES_SET}",
"args0": [
{
"type": "field_variable",
"name": "VAR",
"variable": "%{BKY_VARIABLES_DEFAULT_NAME}"
},
{
"type": "input_value", // This expects an input of any type
"name": "VALUE"
}
],
...
}
扩展
积木中的扩展属性可以将额外的初始化代码或自定义行为添加到积木中。扩展是积木的自定义行为,可以通过JSON定义积木扩展,使用extensions添加积木的扩展名,单个积木可以有多个扩展。
{
"extensions": ["break_warning_extension", "parent_tooltip_extension"],
}
由于扩展执行内容不是Blockly的默认行为,因此需要编写扩展,然后向Blockly注册扩展的API。每个扩展都定义了一个在积木创建时运行的功能。将扩展名添加到积木的“扩展名”键后,表示在创建该类型的每个新积木时,关联函数会运行一次。
Blockly.Extensions.register('parent_tooltip_extension',
function() {
// this refers to the block that the extension is being run on
var thisBlock = this;
this.setTooltip(function() {
var parent = thisBlock.getParent();
return (parent && parent.getInputsInline() && parent.tooltip) ||
Blockly.Msg.MATH_NUMBER_TOOLTIP;
});
});
变体
变体非常类似于扩展。除了更改积木行为之外,它还定义了如何将那些更改保存到XML以及如何从XML加载,变体还可以具有其他UI,供用户配置其状态。在Blockly中,最容易看到的变体是if积木。
积木上只能声明一个变体,使用mutator键在积木的JSON定义中声明它们。
{"mutator": "controls_if_mutator",}
// JS expects a mixin with all of the required methods
Blockly.Extensions.registerMutator('my_mutator_extension',
MY_MUTATOR_MIXIN, null,
// This last argument configures the editor UI on web
['my_subblock', 'my_other_subblock']);
国际化
Blockly可以根据语言,对积木国际化。JSON积木定义中的message字符串可以调整输入,字段和标签。
// Block for creating a list with one element repeated.
{
"type": "lists_repeat",
"message0": "%{BKY_LISTS_REPEAT_TITLE}",
"args0": [
{
"type": "input_value",
"name": "ITEM"
},
{
"type": "input_value",
"name": "NUM",
"check": "Number"
}
],
"output": "Array",
"colour": "%{BKY_LISTS_HUE}",
"tooltip": "%{BKY_LISTS_REPEAT_TOOLTIP}",
"helpUrl": "%{BKY_LISTS_REPEAT_HELPURL}"
}
lists_repeat示例包括几个"%{BKY_...}"字符串。其中每个都是对Blockly.Msg字符串表中字符串的引用。当积木被实例化时, Blockly尝试用该值替换该字符串。
例如,如果LISTS_REPEAT_TITLE存在, %{BKY_LISTS_REPEAT_TITLE}则替换为值 Blockly.Msg['LISTS_REPEAT_TITLE']。如果该值不存在,则%{BKY_...}表示法将保留在原位,并且Blockly会针对缺失的翻译发出警告。