如何使用Javascript创建Blockly块的实例?

时间:2016-04-08 12:37: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;
};

根据您在其上设置的像素数向右移动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的实例,以便以后随时使用它。

1 个答案:

答案 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以查看它是否被使用(如果它是来自打开的类别的块或被拖出它的块,在使用中),我希望它可以帮助你和其他人。