如何动态生成Blockly下拉菜单的内容?

时间:2017-03-08 15:31:10

标签: javascript python json flask blockly

我正在使用python和flask编写应用程序。 在Web界面中,用户可以使用块状地制作小型自定义程序。

一些现有的块有一个下拉菜单。

一切正常。 但是现在我想要一个带有下拉菜单的块,其中选项是usb上的某些文件,通过遍历usb stick目录找到python后端。

我想现在用这些文件填充下拉菜单。但是,我不能提前知道它们,这就是为什么它们必须动态生成 - 但是通过python,而不是通过javascript或类似。

我已经在这里找到了这个:https://developers.google.com/blockly/guides/create-custom-blocks/dropdown-menus(在最后的“动态菜单”中),但这对我的情况没有帮助,因为我希望信息来自python后端而不是来自javascript。

有没有人知道这样做的方法?

提前多多谢谢你!

1 个答案:

答案 0 :(得分:1)

这是一个很老的问题,所以我不确定OP是否仍然需要答案,但是我假设这是OP使用后端异步JavaScript调用的情况,不能因此而返回结果。

在我们的应用程序中(尽管使用的是nodejs后端),情况并非相同,其中我们根据从Google Cloud Datastore检索到的选项填充下拉列表。我们有一个React App,所以我们的解决方案是将Flux存储区附加到窗口上,异步调用在完成后将填充该窗口,然后对该存储区进行下拉生成代码访问。显然,完整的Flux存储可能并不适合所有情况,但是我在这里的一般建议是传入一个选项生成器函数,并从窗口中的存储或其他变量中读取它,然后调用后端在页面加载(或其他适当的时候)上运行,并在窗口上填充商店。如果您的应用在调用完成之前就已启动,则可以将其设置为根据商店上的标志来显示其正在加载选项。

作为一个非常简化的案例,您可能会:

// on page load
window.store = {done: false};
myBackendCall()
.then(function(results){
    window.store = {
        results: results,
        done: true
    };
})
.catch(function(error){
    console.error(error);
    window.store = {results: [], done: true};
});

然后在选择器中,您可以选择类似以下内容的

function generateOptions(){
    if(!window.store.done) {
        return [['Loading...', 'loading']];
    } else {
        return [['Select a file', '']].concat(window.store.results);
    }
}
this.appendDummyInput()
    .appendField(new Blockly.FieldDropdown(generateOptions), fieldName);

很明显,这是一个简单的简化,但是我认为足以证明该技术。实际上,出于其他原因,我们实际上创建了自定义的Blockly字段,但这仍然可以与普通的Blockly下拉菜单一起使用。如果这就是您的设置,请交换Promise链以进行回调。您也可以在块内进行调用,并在块本身上设置变量(this.store或其他任何变量),但这将导致对该块的多个实例进行多次调用,因此可能不适合你。