Fra*_*ero 10 javascript blockly
我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;
};
Run Code Online (Sandbox Code Playgroud)
div根据您在其上设置的像素数向右移动.您将不得不在math_number块内放置一个块move_right来放置您想要移动它的像素数量.
我在我的html文件上有一个workspace注入的变量Blockly workspace:
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
Run Code Online (Sandbox Code Playgroud)
我想做的事
它是在块中已经显示块的一次,而不是之前,从JavaScript中检索这一数量的像素.
我试过了什么
我直接尝试workspace从我的浏览器(谷歌浏览器)的控制台访问该变量,并可以获得"子块"但不是它们的价值.如下:
console.log(workspace.topBlocks_[0].childBlocks_);
Run Code Online (Sandbox Code Playgroud)我还尝试将工作区转换为dom,然后转换为文本:
var xml = Blockly.Xml.workspaceToDom(workspace);
var xml_text = Blockly.Xml.domToText(xml);
console.log(xml_text);
Run Code Online (Sandbox Code Playgroud)
在这里我可以看到"子块"的价值,我的意思是,math_number块,它存储在文本中,但我不知道如何得到它.
为什么我要实现这一目标?
因为我想要的是检查用户是否向右移动了300像素.如果是这样,那么我将展示一条消息,其中我将把"你得到它!".
我的问题
是否可以创建我已放置在工作区上的该块的实例,然后使用该实例访问其像素值?
编辑:
我也可以获得left@Oriol所说的价值:
$('#moveDiv').css('left');
Run Code Online (Sandbox Code Playgroud)
但是我没有把它放在这里,因为它使用了一个属性Jquery(它根本不重要,因为它也是一个很好的选择,但不是预期的).我的目的是得到的一个实例Block把它放在后Blockly workspace在以后的任何时间与它进行操作.
提前致谢!
有一个方法setWarningText来显示这种警告.你可以修改yor生成器,如下所示:
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";
// You can show a blockly warning
if( value_pixels >= 300 ) block.setWarningText("You get it!");
// Or you can store its value elsewere...
// myExternalVar = value_pixels;
return codeMoveRight;
};
Run Code Online (Sandbox Code Playgroud)
这将在块本身中显示为警告图标.
在任何情况下,如果你想"记住"这个value_pixels变量,我相信更简单的方法是在生成器中执行它,如上所示.您始终可以将其存储在可从自定义函数访问的外部var中.
编辑:
如果您需要遍历块结构用于其他目的,您可以使用:
我希望这会给出一个起点,但了解这些"技巧"的最佳方法是阅读Blockly源代码.即使代码通常被很好地评论,AFAIK也无法自动生成文档,也无法在Web上使用.