我创建了一个简单的输入对象:
self.dummy_text = TextInput()
self.dummy_text.css_classes = ['dummy_text']
我想用另一个控件恢复该字段的值。例如,这个按钮:
self.dummy_button = Button(label="Foo", button_type="success")
self.dummy_button.css_classes = ['dummy_button']
如果我手动更改输入文本字段的值,该按钮可以很好地获取输入文本值。但是如果我像这样通过JavaScript(jQuery)修改值,则根本不会收到该值:
$("#bokeh_iframe").contents().find(".dummy_text input").val('text value')
我已在id bokeh_iframe
的iframe中打开了散景图。我需要使用find
,因为直接选择器不起作用。最后,我调用按钮点击方法,如下所示:
$("#bokeh_iframe").contents().find(".dummy_button button").get(0).click();
按钮方法如下所示:
def dummy_button(self):
dummy_text_value = self.dummy_text.value
发生了什么事?我是否需要告诉散景以其他方式同步数据?我是否必须找到另一种通过JavaScript填充该字段的方法?
注意:我需要执行此解决方法,以便从外部应用程序(Electron,使用Node构建)在散景服务器中运行某些操作
注意2:另一个元素:prevObject: jQuery.fn.init(1)
与输入和按钮对象一起出现,可能是那个问题?这就是我需要使用get(0)
答案 0 :(得分:1)
为了让BokehJS机器自动神奇地检测并同步模型属性的更改(例如输入窗口小部件值),通常必须在BokehJS模型对象上设置.value
属性 < / em>,而不是直接更改HTML属性。
然而,Bokeh从来没有真正考虑过操纵Bokeh模型的用例来自&#34;外部&#34; JavaScript,所以它绝对没有优化,使这简单或简单。当Bokeh在页面中呈现文档时,它会在window.Bokeh.index
对象中留下顶级视图的索引。因此,一个绝对可行的方法是根据该索引树查找您关注的输入窗口小部件的Bokeh模型,然后更新其上的.value
字段。
但是,在这种特殊情况下可能在HTML元素上设置值,并且还明确触发change
事件:
$("#bokeh_iframe").contents().find(".dummy_text input")
.val('text value')
.trigger('change');
这肯定会更容易,但是未经测试(遗憾的是,我没有足够的带宽来尝试构建和测试完整的示例。)
或者,有一些方法可以使用CustomJS
回调重新表达您的意图,这是更可取的,因为可以通过{{1}轻松地将CustomJS
JavaScript代码提供给Bokeh模型属性。