首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在JavaScript中初始化Blockly突变体

在JavaScript中初始化Blockly突变体
EN

Stack Overflow用户
提问于 2017-09-18 10:57:58
回答 2查看 2.6K关注 0票数 1

Hi,

据我所知,Blockly中的自定义块可以在JSON或JavaScript中定义,但是如何在JavaScript中初始化一个变体呢?

带有JSON的

代码语言:javascript
代码运行次数:0
运行
复制
Blockly.defineBlocksWithJSONArray([
{....
"mutator": "myMutatorName"
});

然后必须定义Mutator_MIXIN,并使用Blockly.Extension.registerMutator('myMutatorName', Blockly.myMutator_MIXIN, null, null)将变形器添加到块中。

与JavaScript:

代码语言:javascript
代码运行次数:0
运行
复制
Blockly.Blocks['blockName'] = {
 init: function() = {
   ....
   ??? this.setMutator(???)???
   };
}

那么,如何在JavaScript中做到这一点呢?

亲切的问候

一个新的

EN

回答 2

Stack Overflow用户

发布于 2019-03-06 15:58:49

我可能只是晚了一点,但无论如何,我会把答案留给那些需要更多具体例子的人。

在JavaScript中,实际上不需要将mutator绑定到块,只需定义mutationToDom()domToMutation(xmlElement)函数,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
Blockly.Blocks['my_custom_block'] = {
  init() {
    // Define your basic block stuff here
  },
  // Mutator functions
  mutationToDom() {
    let container = document.createElement('mutation');

    // Bind some values to container e.g. container.setAttribute('foo', 3.14);

    return container;
  },
  domToMutation(xmlElement) {
    // Retrieve all attributes from 'xmlElement' and reshape your block
    // e.g. let foo = xmlElement.getAttribute('foo');
    // this.reshape(foo);
  },
  // Aux functions
  reshape(param){
    // Reshape your block...
  }
}

Blockly将自动处理其余部分,并允许您将您的块视为动态块。

如果您需要使用Mutator编辑器UI,则必须定义decompose(workspace)compose(containerBlock)函数,并调用this.setMutator(...)来设置在Mutator中使用的块,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
Blockly.Blocks['my_custom_block'] = {
    init() {
        // Define your basic block stuff here

        // Set all block that will be used in Mutator Editor UI, in this
        // case only 'my_block_A' and 
        this.setMutator(new Blockly.Mutator(['my_block_A', 'my_block_B']));
    },
    // Mutator functions
    mutationToDom() {
        // Same as previous example
    },
    domToMutation(xmlElement) {
        // Same as previous example
    },
    decompose(workspace) {
        // Decomposeyour block here
    },
    compose(containerBlock) {
        // Compose your block here
    },
    // Aux functions
    reshape(param){
        // Same as previous example
    }
}

希望这些简短的例子能帮助到某人:)

票数 3
EN

Stack Overflow用户

发布于 2017-09-25 08:58:26

您必须声明xml如何加载到dom,以及如何将其保存到xml并重新绘制。还请注意它是如何将mutator附加到块元素的,以防这是您需要引用已经存在的mutator的唯一部分。

代码语言:javascript
代码运行次数:0
运行
复制
        init: initFunction (Like you have declared.)
        mutationToDom: MutationToDom,
        domToMutation: DomToMutation,
        updateShape_: UpdateShape`

如果您所需要的只是创建一个对mutator的引用,那么您需要的就是这类元素,我们将以编程的方式创建这个元素:

代码语言:javascript
代码运行次数:0
运行
复制
<mutation mutator_name="true"></mutation>

下面的片段是附加函数mutationToDom,DomtoMutation UpdateShape的一个示例,它有条件地附加额外的输入。我有一个带复选框的块,当启用时,会添加一个额外的输入。

代码语言:javascript
代码运行次数:0
运行
复制
   function MutationToDom() {
    var container = document.createElement('mutation');
    var continueOnError = (this.getFieldValue('HasCONTINUE') == 'TRUE');
    container.setAttribute('continueOnError', continueOnError);
    return container;
}

function DomToMutation(xmlElement) {
    var continueOnError = (xmlElement.getAttribute('continueOnError') == 'true');
    this.updateShape_(continueOnError);
}

function UpdateShape(continueOnError) {
    // Add or remove a Value Input.
    if (continueOnError) {
        this.appendValueInput("CONTINUE_ON_ERROR")
            .setCheck('CONTINUE_ON_ERROR');
    } else {
        if (this.childBlocks_.length > 0) {
            for (var i = 0; i < this.childBlocks_.length; i++) {
                if (this.childBlocks_[i].type == 'continue_on_error') {
                    this.childBlocks_[i].unplug();
                    break;
                }
            }
        }
        this.removeInput('CONTINUE_ON_ERROR');
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46277625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档