Blockly دو راه برای تعریف بلوک ها دارد: اشیاء JSON که از جفت های کلید-مقدار استفاده می کنند و توابع جاوا اسکریپت که API Blockly را فراخوانی می کنند. فرمت JSON ترجیح داده می شود زیرا بومی سازی را ساده می کند و خواندن و نوشتن آسان تر است. با این حال، نمی توان از آن برای تعریف مستقیم ویژگی های پیشرفته مانند جهش دهنده ها یا اعتبار سنجی ها استفاده کرد. اینها باید در جاوا اسکریپت نوشته شوند، معمولاً به صورت پسوند .
از JSON یا جاوا اسکریپت استفاده کنید
این بلوک:
را می توان در JSON یا جاوا اسکریپت به صورت زیر تعریف کرد.
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
ذخیره می کند.
جاوا اسکریپت
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 و جاوا اسکریپت را مخلوط کنید
فرمت JSON در درجه اول از تعریف ظاهر و احساس یک بلوک پشتیبانی می کند. نمیتواند مستقیماً برخی از ویژگیها را تعریف کند، مانند اعتباردهندهها و جهشدهندهها، که نیاز به تعریف یک تابع دارند. برای حل این مشکل، تا جایی که ممکن است بلاک خود را با JSON تعریف کنید و برای بقیه از جاوا اسکریپت استفاده کنید.
مثال زیر یک تعریف بلوک با یک تابع init
ایجاد می کند که jsonInit
برای بارگذاری یک شی JSON و API جاوا اسکریپت برای تعریف یک راهنمای ابزار پویا استفاده می کند.
جاوا اسکریپت
// 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'));
});
}
};
Block definition API
این بخش اشیاء و توابع مورد استفاده برای تعریف بلوک های سفارشی را خلاصه می کند.
Blockly.Blocks
Blockly.Blocks
یک شی است که تعاریف بلوک را ذخیره می کند. کلیدهای آن نام نوع بلوک و مقادیر آن اشیاء تعریف بلوک هستند. هنگام تعریف بلوک ها با جاوا اسکریپت 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)
می شود. jsonInit
در تابع init
برای بارگذاری یک شی JSON استفاده کنید.
var myJson = {
// ...
};
Blockly.Blocks['my_block'] = {
init: function() {
this.jsonInit(myJson);
// The rest of the init function.
}
};