问题描述
这是有问题的块
{
"type": "local","message0": "%{BKY_LOCAL_TITLE}","args0": [
{
"type": "input_dummy"
},{
"type": "input_statement","name": "DEFINE","check": "Local"
},{
"type": "input_value","name": "EXPRESSION"
}
],"inputsInline": true,"output": null,"style":"local_blocks"
}
它用于函数的本地定义。
“定义” arg包含许多功能和变量定义块。问题是,如果我尝试访问定义,无论做什么都只能获得堆栈中的第一个块。
我尝试使用statementToCode和BlockToCode直接调用
Blockly.JavaScript.valuetoCode(block,'DEFINE',Blockly.JavaScript.ORDER_FUNCTION_CALL) ;
Blockly.JavaScript.statementToCode(block,Blockly.JavaScript.ORDER_FUNCTION_CALL);
Blockly.JavaScript.blockToCode(block.getInputTargetBlock('DEFINE')); //neither works
我尝试进行for循环,但DEFINE0,DEFINE1等不存在。
那么您如何真正将块堆叠在DEFINE字段中?
编辑:我检查了block.getChildren()。length,它始终为2(因此是表达式+定义),这意味着,正如预期的那样,定义列表嵌套在第一个孩子中。
Blockly.JavaScript['define_name'] = function(block) {
[...]
Blockly.JavaScript.deFinitions_['%' + name] = code;
return null;
};
这意味着它们没有返回值。但是我仍然应该能够全部调用它们。当我使用statementToCode或类似的方法时,我确实会获得第一个定义(在图像函数local-deFinition中),而不是其余的。我交换了它们,它始终是第一个生成代码的人。
所以我真的看不到问题。在其他示例中,他们几乎什么也没做
var branch = Blockly.JavaScript.statementToCode(block,'STACK');
那为什么在这里不起作用?
解决方法
仅供未来的考古学家使用
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks);
}while (define_blocks = define_blocks.getNextBlock());
,
对于所有想知道为什么blockToCode返回您重复代码的人-将true传递给blockToCode方法
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks,true);
}while (define_blocks = define_blocks.getNextBlock());