Blockly 有兩種定義區塊的方式:使用鍵/值配對的 JSON 物件,以及呼叫 Blockly API 的 JavaScript 函式。建議使用 JSON 格式,因為這種格式簡化了本地化作業,且易於讀取及編寫。不過,您無法使用這個方法直接定義變異子或驗證器等進階功能。這些項目必須以 JavaScript 編寫,通常是擴充功能。
使用 JSON 或 JavaScript
這個積木:

可以透過 JSON 或 JavaScript 定義,如下所示。
JSON
Blockly.common.defineBlocksWithJsonArray([{
"type": "string_length",
"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"
}]);
defineBlocksWithJsonArray 會將每個 JSON 物件轉換為具有 init 函式的區塊定義物件。這項服務會將這些物件儲存在 Blockly.Blocks 中。
JavaScript
Blockly.Blocks['string_length'] = {
init: function() {
this.appendValueInput('VALUE')
.setCheck('String')
.appendField('length of');
this.setOutput(true, 'Number');
this.setColour(160);
this.setTooltip('Returns number of letters in the provided text.');
this.setHelpUrl('http://www.w3schools.com/jsref/jsref_length_string.asp');
}
};
由於區塊定義物件會混入區塊物件,因此關鍵字 this 是指正在建立的實際區塊。
這兩種方法都會將區塊定義物件儲存在 Blockly.Blocks 中,並以區塊類型名稱 (string_length) 做為鍵。區塊定義物件具有單一方法 (init),可定義區塊的形狀。
混合使用 JSON 和 JavaScript
JSON 格式主要用於定義區塊的外觀和風格。它無法直接定義驗證器和變異器等功能,您必須定義函式。如要解決這個問題,請盡可能使用 JSON 定義區塊,其餘部分則使用 JavaScript。
下列範例會使用 init 函式建立區塊定義,該函式會使用 jsonInit 載入 JSON 物件,並使用 JavaScript API 定義動態工具提示。
JavaScript
// Define the block structure in JSON.
var mathChangeJson = {
"message0": "change %1 by %2",
"args0": [
{"type": "field_variable", "name": "VAR", "variable": "item", "variableTypes": [""]},
{"type": "input_value", "name": "DELTA", "check": "Number"}
],
"previousStatement": null,
"nextStatement": null,
"colour": 230
};
Blockly.Blocks['math_change'] = {
init: function() {
// Use jsonInit to load the JSON block structure.
this.jsonInit(mathChangeJson);
// Use JavaScript to define a tooltip function.
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
return 'Add a number to variable "%1".'.replace('%1',
thisBlock.getFieldValue('VAR'));
});
}
};
區塊定義 API
本節將摘要說明用於定義自訂方塊的物件和函式。
Blockly.Blocks
Blockly.Blocks 是儲存區塊定義的物件。索引鍵是區塊類型名稱,值則是區塊定義物件。使用 JavaScript 定義區塊時,請使用 Blockly.Blocks:
Blockly.Blocks['my_block'] = {
init: function() {/* ... */},
onchange: function() {/* ... */},
// ...
}
常見的錯誤是假設 Blockly.Blocks 商店會封鎖,並嘗試執行類似下列的操作。這項作業會失敗,因為 Blockly.Blocks 儲存的是區塊定義,而非區塊。
// Fails with "Blockly.Blocks.my_block.setColour is not a function".
Blockly.Blocks['my_block'].setColour(150);
defineBlocksWithJsonArray
defineBlocksWithJsonArray
會接受 JSON 物件陣列、從中建立區塊定義,並將這些定義新增至 Blockly.Blocks。
Blockly.common.defineBlocksWithJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
createBlockDefinitionsFromJsonArray 和 defineBlocks
createBlockDefinitionsFromJsonArray 接受 JSON 物件陣列,並傳回將區塊型別名稱對應至區塊定義的物件。這通常會與 defineBlocks 搭配使用,將區塊定義新增至 Blockly.Blocks。
const myBlockDefinitions = Blockly.common.createBlockDefinitionsFromJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
Blockly.common.defineBlocks(myBlockDefinitions);
Block.jsonInit
jsonInit 接受 JSON 物件,並呼叫 Block 上的對應方法。舉例來說,如果 JSON 物件含有鍵/值組合 colour: 150,就會呼叫 this.setColour(150)。在 init 函式中使用 jsonInit 載入 JSON 物件。
var myJson = {
// ...
};
Blockly.Blocks['my_block'] = {
init: function() {
this.jsonInit(myJson);
// The rest of the init function.
}
};