1

我正在使用 python 和烧瓶编写应用程序。在 Web 界面中,用户可以使用 blockly 制作小型定制程序。

一些已经存在的块有一个下拉菜单。

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

我现在想用这些文件填充下拉菜单。但是,我无法提前知道它们,这就是为什么它们必须动态生成的原因——但是通过 python,而不是通过 javascript 等。

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

有谁知道这样做的方法?

非常感谢您!

4

1 回答 1

2

这是一个很老的问题,所以我不确定 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或其他)上设置一个变量,但这会导致对块的多个实例进行多次调用,因此这可能不适合您。

于 2018-06-26T17:19:27.560 回答