2017-08-17 51 views
1

我创建了一个简单的输入对象是这样的:如何在JavaScript中设置Bokeh中的输入文本字段的值?

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') 

我已经打开的背景虚化在iframe id为bokeh_iframe。我需要使用find,因为直接选择器不工作。最后,我调用按钮单击方法是这样的:

$("#bokeh_iframe").contents().find(".dummy_button button").get(0).click(); 

按钮的方法是这样的:

def dummy_button(self): 
    dummy_text_value = self.dummy_text.value 

这是怎么回事?我需要告诉散景以其他方式同步数据吗?我是否需要找到另一种通过JavaScript填充字段的方法?

注:我需要做此解决方法从外部应用程序(电子,即是建立与节点)

注2运行在背景虚化服务器的一些行动:另一个要素:prevObject: jQuery.fn.init(1)出现与输入和按键对象,可能是这个问题?这就是为什么我需要使用get(0)

回答

1

为了使BokehJS机械自动神奇地检测和同步更改属性(如输入控件的值)的模式,你通常都设置.value属性在BokehJS模型对象,而不是直接更改HTML属性。

但是,Bokeh从来没有真正意识到从“外部”JavaScript操作Bokeh模型的用例,所以它绝对没有被优化以简化或简化。当Bokeh渲染页面中的文档时,它会在window.Bokeh.index对象中留下顶层视图的索引。因此,一种绝对可行的方法是根据索引树找到您关心的输入窗口小部件的散景模型,然后更新其上的.value字段。

然而,可以在这种特殊情况下的工作设置HTML元素的值,并且也明确触发change事件:

$("#bokeh_iframe").contents().find(".dummy_text input") 
    .val('text value') 
    .trigger('change'); 

那肯定会更容易,但未经测试(我不“吨有带宽,试图构建和测试一个完整的例子,令人遗憾。)


或者有某种方式使用CustomJS回调来重新表达你的意图,使得w因为Bokeh模型可以通过args属性很容易地通过CustomJS JavaScript代码获得。

+0

我感谢你的帮助。你的意思是像这样使用args属性吗? 'CustomJS(args = dict(source = source),code =“”“[...这种方式我会把参数从Python发送到JavsScript。实际上,我打算做相反的事情,从JavaScript(从外部应用程序,而不是CustomJS代码)向Python方法发送一个参数。这就是为什么我用这个参数填充虚拟文本字段。有没有更好的方法来做到这一点? – ChesuCR

+0

我测试了'trigger('change')'解决方案,但它不起作用:( – ChesuCR

+0

我也试过' window.document.Bokeh.index'解决方案,它的工作原理是这样的:var models = window.Bokeh.index [Object.keys(window.Bokeh.index)[0]]。model.document。 _all_models; var input_dummy_text = models [dummy_text_id]; input_dummy_text.value ='new value'' – ChesuCR

相关问题