我在Blockly
文件中使用customBlocks.js
完成了以下块:
Blockly.Blocks['move_right'] = {
init: function() {
this.appendValueInput("PIXELS")
.setCheck("Number")
.appendField("move to right");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(290);
this.setTooltip('');
this.setHelpUrl('http://www.example.com/');
}
};
Blockly.JavaScript['move_right'] = function(block) {
var value_pixels = Blockly.JavaScript.valueToCode(block, 'PIXELS', Blockly.JavaScript.ORDER_ATOMIC);
// TODO: Assemble JavaScript into code variable.
var codeMoveRight = "$(\"#moveDiv\").animate({\n " +
"left: \"+=" + value_pixels + "px\"\n" +
"},1000);\n";
return codeMoveRight;
};
根据您在其上设置的像素数向右移动div
。您必须在math_number
块中添加move_right
块以放置您想要移动它的像素数量。
我的html
文件中有一个注入workspace
的{{1}}变量:
Blockly workspace
我想做什么
在Blockly的工作区中显示一次块时,从JavaScript中检索此像素数量,而不是之前。
我尝试了什么
我直接尝试从我的浏览器(谷歌浏览器)的控制台访问var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
变量,并且可以获得“子块”但不是它们的值。如下:
workspace
我还尝试将工作区转换为dom,然后转换为文本:
console.log(workspace.topBlocks_[0].childBlocks_);
在这里,我可以看到“子块”的值,我的意思是var xml = Blockly.Xml.workspaceToDom(workspace);
var xml_text = Blockly.Xml.domToText(xml);
console.log(xml_text);
块,它存储在文本中,但我不知道如何得到它。
为什么我要实现这一目标?
因为我想要的是检查用户是否向右移动了300像素。如果是这样,那么我将展示一条消息,其中我将“你得到它!”。
我的问题
是否可以创建我放置在工作区上的Block的实例,然后使用该实例访问其像素值?
修改
我也可以获得math_number
值,因为@Oriol说:
left
但是我没有把它放在这里,因为它使用了$('#moveDiv').css('left');
的属性(根本不重要,因为它也是一个不错的选择,但不是预期的)。我的目的是在Jquery
之后获取Block
的实例,以便以后随时使用它。
答案 0 :(得分:0)
我知道这个问题有些陈旧,但如果你仍然想要更细粒度的访问,你应该使用块ID
(每个块都有一个唯一的Blockly.Blocks['my_block_unique_name'] = {
init: function() {
this.appendDummyInput("this_input_unique_name_for_this_block")
.appendField("this block do:")
.appendField(new Blockly.SomeField(...), "this_field_unique_name_for_this_block");
this.setColour(60);
this.setTooltip('this block do something');
}
//an crude example, be aware that blocks on fyout list will trigger it, if you did not use the block this block is disposed.
console.log(this.id);
};
)。
并且,要获取块元素,请不要忘记定义其输入和字段名称,以便您可以参考它们:
示例块:
ID
您可以使用某个事件获取其IDs
,将mainworkspace = Blockly.mainWorkspace
block = mainworkspace.getBlockById(id);
input = block.getInput("imageInput");
// You can use `setField(newValue,name)` too in a more clean way.
input.removeField("FieldImageButton");
input.appendField(new Blockly.SomeField(...), "this_field_unique_name_for_this_block")
与其他地方的有用信息存储在一起等等......
所以你可以做以下事情:
isInFlyout
所以你可以分析块tableView.reloadData
以查看它是否被使用(如果它是来自打开的类别的块或被拖出它的块,在使用中),我希望它可以帮助你和其他人。