如何从Blockly中的input_statement获取语句堆栈



所以这就是中的块

屏幕截图

{
"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" 
}

它用于函数的局部定义。

"Define"参数包含许多函数和变量定义块。问题是,如果我尝试访问define,无论我做什么,我都只能获得堆栈中的第一个块

我试着用statementToCode和BlockToCode 直接调用它

Blockly.JavaScript.valueToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL) ;

Blockly.JavaScript.statementToCode(block, 'DEFINE', 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或类似的语句时,我会得到第一个定义(在图像函数的本地定义中(,但不会得到其余的。我交换了它们,它总是第一个生成代码的定义。

所以我真的不认为这个问题。在其他例子中,他们几乎什么都不做,只做

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());

相关内容

最新更新