Blockly offre due modi per definire i blocchi: oggetti JSON, che utilizzano coppie chiave-valore, e funzioni JavaScript, che chiamano l'API di Blockly. Il formato JSON è preferito perché semplifica la localizzazione ed è più facile da leggere e scrivere. Tuttavia, non può essere utilizzato per definire direttamente funzionalità avanzate come mutatori o convalidatori. Devono essere scritti in JavaScript, in genere come estensioni.
Utilizza JSON o JavaScript
Questo blocco:
può essere definito in JSON o JavaScript come segue.
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
converte ogni oggetto JSON in un oggetto di definizione del blocco con una funzione init
. Memorizza questi oggetti in 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');
}
};
Poiché gli oggetti di definizione del blocco sono integrati negli oggetti blocco, la parola chiave this
fa riferimento al blocco effettivo in fase di creazione.
Entrambi i metodi fanno sì che un oggetto di definizione del blocco venga memorizzato in
Blockly.Blocks
con una chiave del nome del tipo di blocco (string_length
). L'oggetto
di definizione del blocco ha un singolo metodo (init
), che definisce la forma del blocco.
Combinare JSON e JavaScript
Il formato JSON supporta principalmente la definizione dell'aspetto di un blocco. Non può definire direttamente alcune funzionalità, come i validatori e i mutatori, che richiedono la definizione di una funzione. Per risolvere il problema, definisci il maggior numero possibile di elementi del blocco con JSON e utilizza JavaScript per il resto.
L'esempio seguente crea una definizione di blocco con una funzione init
, che utilizza jsonInit
per caricare un oggetto JSON e l'API JavaScript per definire una descrizione comando dinamica.
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 di definizione dei blocchi
Questa sezione riassume gli oggetti e le funzioni utilizzati per definire i blocchi personalizzati.
Blockly.Blocks
Blockly.Blocks
è un oggetto
che memorizza le definizioni dei blocchi. Le chiavi sono i nomi dei tipi di blocco e i valori sono oggetti di definizione dei blocchi. Utilizza Blockly.Blocks
quando definisci blocchi con
JavaScript:
Blockly.Blocks['my_block'] = {
init: function() {/* ... */},
onchange: function() {/* ... */},
// ...
}
Un errore comune è assumere che Blockly.Blocks
memorizzi blocchi e provare qualcosa come segue. L'operazione non riesce perché Blockly.Blocks
memorizza le definizioni dei blocchi, non i blocchi.
// Fails with "Blockly.Blocks.my_block.setColour is not a function".
Blockly.Blocks['my_block'].setColour(150);
defineBlocksWithJsonArray
defineBlocksWithJsonArray
accetta un array di oggetti JSON, ne crea le definizioni dei blocchi e li aggiunge
a Blockly.Blocks
.
Blockly.common.defineBlocksWithJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
createBlockDefinitionsFromJsonArray e defineBlocks
createBlockDefinitionsFromJsonArray
accetta un array di oggetti JSON e restituisce un oggetto che mappa i nomi dei tipi di blocco alle definizioni dei blocchi. Questo elemento viene generalmente utilizzato con defineBlocks
, che aggiunge le definizioni dei blocchi a Blockly.Blocks
.
const myBlockDefinitions = Blockly.common.createBlockDefinitionsFromJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
Blockly.common.defineBlocks(myBlockDefinitions);
Block.jsonInit
jsonInit
accetta un oggetto JSON e chiama i metodi corrispondenti su Block
. Ad esempio, un oggetto JSON con la coppia chiave-valore colour: 150
genera una chiamata a this.setColour(150)
. Utilizza jsonInit
in una funzione init
per caricare un oggetto JSON.
var myJson = {
// ...
};
Blockly.Blocks['my_block'] = {
init: function() {
this.jsonInit(myJson);
// The rest of the init function.
}
};