效果图如下:
js部分
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="blockly_compressed.js"></script>
<script type="text/javascript" src="blocks_compressed.js"></script>
<script type="text/javascript" src="zh-hans.js"></script>
</head>
<body>
<xml id="toolbox">
<category name="测试" colour="#37B7FF">
<block type="dynamic_block"></block>
</category>
</xml>
<div id="blocklyDiv" style="height:100vh; width: 100%;"></div>
<div style="position: absolute;top: 200px;left: 100px;">
<a href="javascript:dynamicBlockFun.update_dynamic_block([['option1','1']],'');">变为option1</a>
<a href="javascript:dynamicBlockFun.update_dynamic_block([['option2','2']],'');">变为option2</a>
<a href="javascript:dynamicBlockFun.update_dynamic_block([['option3','3']],'');">变为option3</a>
</div>
</body>
<script type="text/javascript">
//初始化workspace工作区间
var dynamicBlockFun = {
dynamic_block_options: [["默认值?", "-1"]],
dynamic_block: function () {
var _this = this;
Blockly.Blocks["dynamic_block"] = {
init: function () {
this.jsonInit({
type: "dynamic_block",
message0: "动态设置 %1",
args0: [
{
type: "field_dropdown",
name: "WORD",
options: function () {
return _this.dynamic_block_options;
},
}
],
"inputsInline": true,
"output": null,
"colour": 230,
"tooltip": "",
"helpUrl": ""
});
},
}
},
update_dynamic_block(options, deleteItem) {
var setDynamicOptions =
options && options.length > 0 ? options : [["默认值?", "-1"]];
this.dynamic_block_options= setDynamicOptions;
for (var i = 0;i < workspace.getBlocksByType("dynamic_block").length;i++) {
if (workspace.getBlocksByType("dynamic_block")[i].getField("WORD").getValue()=== "-1" ||
workspace.getBlocksByType("dynamic_block")[i].getField("WORD").getValue() == deleteItem ||
!options.some((v) => v[1] == workspace.getBlocksByType("dynamic_block")[i].getField("WORD").getValue())) {
workspace.getBlocksByType("dynamic_block")[i].getField("WORD").setValue(setDynamicOptions [0][1]);
workspace.getBlocksByType("dynamic_block")[i].getField("WORD").setText(setDynamicOptions [0][0]);
}
}
}
}
dynamicBlockFun.dynamic_block()
window.workspace = Blockly.inject('blocklyDiv',
{
toolbox: document.getElementById('toolbox'),
trashcan: false
});
</script>
</html>