我正在使用python和flask编写应用程序。 在Web界面中,用户可以使用块状地制作小型自定义程序。
一些现有的块有一个下拉菜单。
一切正常。 但是现在我想要一个带有下拉菜单的块,其中选项是usb上的某些文件,通过遍历usb stick目录找到python后端。
我想现在用这些文件填充下拉菜单。但是,我不能提前知道它们,这就是为什么它们必须动态生成 - 但是通过python,而不是通过javascript或类似。
我已经在这里找到了这个:https://developers.google.com/blockly/guides/create-custom-blocks/dropdown-menus(在最后的“动态菜单”中),但这对我的情况没有帮助,因为我希望信息来自python后端而不是来自javascript。
有没有人知道这样做的方法?
提前多多谢谢你!
答案 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
或其他任何变量),但这将导致对该块的多个实例进行多次调用,因此可能不适合你。