我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) 是否可以在WPF WebBrowser中使用Blockly google javascript库?
特别是,Blockly需要几个js脚本.我们如何引用js库?
我有一个块状应用程序,它生成一些输出代码。现在,是否可以编写一些函数来获取我的输出代码并将相应的块放在工作区上。例如,在此页面上,https://developers.google.com/blockly/
块被连接以生成javascript代码,但是有什么办法,我将给出javascript代码并且块将出现在工作区上。
我正在使用JavaScript将字符串转换为Google Blockly块
输入字符串类似于"Hello %s World"-在其中%s定义字符串输入。我需要将其转换为:
Blockly.Blocks['blockname'] = {
init: function() {
this.appendDummyInput()
.appendField("Hello ")
.appendField(new Blockly.FieldTextInput("input1"), "")
.appendField(" World");
}
};
Run Code Online (Sandbox Code Playgroud)
但是我不确定在不使用eval()的情况下如何实现这一目标,并且由于输入字符串来自用户,因此我知道使用eval()并不是一个好主意。
我当前的代码是:
currentLine = blockText[x].split(/(%s)/);
for( var y = 0; y < currentLine.length; y++ )
{
if( currentLine[y] == "" )
{
//do nothing
}
else if( currentLine[y] == "%s" )
{
//create a input
}
else
{
//create a label
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何创建所需的Blockly代码,而无需在字符串中构建JavaScript,然后在末尾使用eval()。
有人可以帮我吗?
我知道我可以用
Blockly.JavaScript['my_code'] = function() { ... }
Run Code Online (Sandbox Code Playgroud)
但是,如何添加其他语言支持(如JSON)呢?我试过了 ..
Blockly.Json['my_code'] = function() { ... }
Run Code Online (Sandbox Code Playgroud)
当我尝试恢复时失败
Blockly.Json.workspaceToCode(this.workspace)
Run Code Online (Sandbox Code Playgroud)
workspaceToCode 不是功能。
我需要为Blockly添加新语言
我不会显示这种新语言(JSON),它将仅用于向机器人发送指令。
我试着
Blockly.Json = new Blockly.Generator('Json');
Blockly.Json['my_code'] = function() { ... }
Run Code Online (Sandbox Code Playgroud)
但是发生错误
Blockly.Json.workspaceToCode(this.workspace)
Run Code Online (Sandbox Code Playgroud)
错误..
Uncaught TypeError: this.init is not a function
at js.ou3v.module.exports.Blockly.Generator.workspaceToCode
Run Code Online (Sandbox Code Playgroud) 我尝试在 Angular 7 应用程序中使用 Blockly,但无法注入 Blockly 编辑器。
我已经从https://developers.google.com/blockly/guides/get-started/web下载了文件,并将 blockly_compressed.js 复制到我的 src 目录中(并将其重命名为 blockly.js)。然后我尝试从我的组件访问 Blockly 并收到错误。
我尝试过的:
导入“../blockly.js”
无法编译,给出“错误 TS2304:找不到名称“Blockly”。”
import { Blockly } from '../blockly'
Run Code Online (Sandbox Code Playgroud)
编译,但在浏览器中打开应用程序时出现以下错误:
ERROR TypeError: _blockly__WEBPACK_IMPORTED_MODULE_4__.Blockly.inject is not a function
Run Code Online (Sandbox Code Playgroud)
添加包含以下内容的 blockly.d.ts 文件:
export namespace Blockly {
export function inject(div: string, config: any): void;
}
Run Code Online (Sandbox Code Playgroud)
给出与上面相同的错误。
关于我还可以尝试什么的任何建议?
我正在尝试调整我的Blockly workspacediv 内部。我希望如果页面变小,div 和Blockly workspace它的内部也会变小。
我知道它的文档Google中提供了一种方法,但我认为它有点“脏”,你必须使用大量代码来调整它的大小。
查看调试器,Google Chrome我发现我可以将 a 设置max-height为svg对象,但我不知道height在注入工作区时如何更改它:
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
Run Code Online (Sandbox Code Playgroud)
无论如何,它根本无法解决我的问题(只是在调整页面大小之前避免工作区大于 div )。
我也尝试改变我blocklyDiv注入的内容,Blockly workspace但display: flex;它没有改变任何东西。
有没有比Google's示例更好的方法来调整 的大小Blockly workspace?
提前致谢!
如何根据下拉值更改隐藏字段。
我添加了一个名为“A”的输入字段。我有一个下拉字段。如果我在下拉列表中选择一个值,例如“删除字段 A”,则应删除输入字段。
我试过removeField。但它没有用。还有其他方法吗?或者如何正确使用删除字段?
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField('Type ')
.appendField(new Blockly.FieldDropdown(typeOptions), 'columnType');
// if columnType = Card, show the following:
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(' Card: ')
.appendField(new Blockly.FieldDropdown(cardsList), 'cardValue');
// if columnType = view, show the following:
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(' View ')
.appendField(new Blockly.FieldDropdown(viewsList), 'viewValue');
Run Code Online (Sandbox Code Playgroud) 首先,在在这里深入研究之前,我已经问过这个问题的更简单版本。但是,当我搜索时,事情变得更加复杂,我可以再描述一下。
我正在尝试使用 Google 的 Blockly 创建一个电子应用程序。重命名 Blockly 域中的变量会在用户浏览器中打开一个提示,要求输入新变量的名称,正如您在它自己的网站上看到的那样(单击“计数”并选择“重命名变量...”)。
问题是:Electron 不支持window.prompt(),如果我让代码保持原样,它也不会做任何事情,因此,经过一番搜索,我了解到您可以覆盖Blockly.prompt以使用自己的代码。我的猜测:所以你可以使用替代方案window.prompt()
我安装electron-prompt并尝试使用它来获取用户在新提示窗口中的输入,以将其发送回 Blockly 处理重命名的核心函数。这是我正在尝试的:
var prompt = require('electron-prompt');
var setPrompt = function()
{
return prompt
({
title: 'Renaming',
label: 'Renaming variable to:',
type: 'input'
})
};
var getPrompt = function()
{
return setPrompt().then(function(value){return value})
}
var promptReturn = function()
{
return getPrompt().then(function(value){return value})
}
Blockly.prompt = function(message, defaultValue, callback)
{
callback(promptReturn().then(function(value){return value}));
};
Run Code Online (Sandbox Code Playgroud)
编辑:从源代码electron-prompt是在这里,并通过观察它,我试图从适应信息 …
所以这就是有问题的块
{
"type": "local",
"message0": "%{BKY_LOCAL_TITLE}",
"args0": [
{
"type": "input_dummy"
},
{
"type": "input_statement",
"name": "DEFINE",
"check": "Local"
},
{
"type": "input_value",
"name": "EXPRESSION"
}
],
"inputsInline": true,
"output": null,
"style":"local_blocks"
}
Run Code Online (Sandbox Code Playgroud)
它用于函数的局部定义。
“定义”参数包含许多函数和变量定义块。问题是,如果我尝试访问定义,无论我做什么,我都只能获取堆栈中的第一个块。
我尝试直接用statementToCode和BlockToCode调用它
Blockly.JavaScript.valueToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL) ;
Blockly.JavaScript.statementToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL);
Blockly.JavaScript.blockToCode(block.getInputTargetBlock('DEFINE')); //neither works
Run Code Online (Sandbox Code Playgroud)
我尝试执行 for 循环,但 DEFINE0、DEFINE1 等不存在。
那么如何真正将块堆叠在 DEFINE 字段中呢?
编辑:我检查了 block.getChildren().length ,它始终为 2(因此表达式 + 定义),这意味着,正如预期的那样,定义列表嵌套在第一个子元素中。
另一个问题可能是定义列表是函数定义,即它们生成如下代码:
Blockly.JavaScript['define_name'] = function(block) {
[...]
Blockly.JavaScript.definitions_['%' + name] = code;
return null;
};
Run Code Online (Sandbox Code Playgroud)
这意味着它们没有返回值。但我仍然应该能够调用它们。当我使用statementToCode或类似的方法时,我确实得到了第一个定义(在图像函数本地定义中),但没有得到其余的。我交换了它们,它总是第一个生成代码的。
所以我真的没有看到这个问题。在其他例子中,他们几乎什么也不做,只是
var branch = …Run Code Online (Sandbox Code Playgroud) 我想查询 DOM 以通过 ID 获取块。目前我必须通过类名查找所有元素,并手动提取正确的索引,这是不可持续的。
如何给一个区块一个唯一的 ID?
谢谢