我正在尝试制作一个 Mutator 以允许使用一组用户指定的属性创建对象。我想要一些类似于函数的 mutator 的东西,您可以在其中添加另一个参数,它会更新参数名称。
目前,我的代码正在验证名称并自动生成新的属性名称,但是 mutator 块不会更新文本,这意味着它与我设置为的原始文本(在本例中为属性 0)卡住了。从此处拖动新块时,新块以非冲突方式正确标记。谁能帮我让 mutator UI 更新值?
这看起来像的一个例子是here。一个新的且正确标记的块已从 mutator 的冲突“property0”块中拖出。用户可以编辑此块,但如前所述,拖走新块时该值不会自动更新。
我的 mutator 块代码如下
Blockly.Blocks["object_new_prop"] = {
init: function() {
this.nameField_ = new Blockly.FieldTextInput("", this.validator_);
this.appendDummyInput()
.appendField("Property: ")
.appendField(this.nameField_, "NAME");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(Blockly.Constants.Object.HUE);
this.setTooltip("Adds an additional property to object definition.");
this.contextMenu = false;
// correctly label the field label
this.genNextLabel_();
},
/**
* Generates and sets a valid non-conflicting label for a property name.
* @return the next label used for a property name.
**/
genNextLabel_: function() {
var defaultName = "property", i = 0;
while (this.nameField_.validator_(defaultName + i) === null) {
++i;
}
this.nameField_.setValue(defaultName + i);
console.log(this);
return defaultName + i;
},
/**
* Validates a property name choice.
* @param propname the property name given to the field.
* @return the property name if valid, otherwise null.
**/
validator_: function(propname) {
// remove repeated whitespace, and leading and trailing whitespace from property name
propname = propname.replace(/[\s\xa0]+/g, "").replace(/^ | $/g, '');
if (!propname) {
return null;
}
// prevent duplicate property names
var sourceBlock = this.getSourceBlock();
var workspace = sourceBlock.workspace.targetWorkspace ||
sourceBlock.workspace;
var caselessName = propname.toLowerCase();
// iterate all blocks in mutator workspace
var blocks = workspace.getAllBlocks(false);
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].id == sourceBlock.id) {
// skip container block
continue;
}
// check for same value
var otherVar = blocks[i].getFieldValue("NAME");
if (otherVar && otherVar.toLowerCase() == caselessName) {
return null;
}
}
// valid, return value
return propname;
},
}