首页 文章

与其他JavaScript库的接口散景服务器

提问于
浏览
0

你可以在客户端将bokeh服务器与JQuery库(如JQuery)连接起来吗?

我想实现一个高级表单,并且已经运行了一个Bokeh服务器应用程序 .

然而,随着越来越多的工作正在进行中,我遇到了许多与Bokeh API有关的问题,例如缺少功能(回调,选项......),未解决的错误,不稳定性等等 .

我得出的结论是,应用程序的某些部分更好地在Bokeh(图形)中,而其他部分(例如表单)则使用更专用的API实现,例如在纯Javascript中 .

这是可行的,甚至是推荐的吗?如果是这样,怎么办?

我看到在bokeh中存在Ajax data source,但是我为了在Bokeh服务器和客户端JS页面之间进行通信而做了'm not sure it' .

任何建议,解释或示例表示赞赏,

谢谢

1 回答

  • 0

    你绝对可以做到这一点 - 我能够使用 ClojureScript re-frame 中创建的输入小部件来使用Bokeh .

    有两种方法可以解决这个问题:

    • 为相关表格/输入创建 ColumnDataSource . 在表单/输入的JS代码中,你'll be able to query values and set new ones (don' t忘记之后调用 data_source.change.emit()

    • 为相关表单/输入(examples)创建单独的Bokeh模型,其中每个字段将映射到表单或输入中的对应值 . 在这种情况下,您不需要调用 emit - 您只需设置值即可

    截至目前,这两种方法都存在相同的问题 - 由于bokeh/issues/3117bokeh/issues/3349,您不能只将一个任意模型(无论是 ColumnDataSource 还是某些自定义模型)添加到Bokeh文档中,但您可以创建自定义模型为了这:

    from bokeh.core.properties import Instance, List
    from bokeh.model import Model, DataSource
    
    
    class DataSourceRoot(Model):
        sources = List(Instance(DataSource))
    
        __implementation__ = TypeScript("""
        import {DOMView} from "core/dom_view"
        import {Model} from "model"
        import * as p from "core/properties"
    
        export class DataSourceRootView extends DOMView {
            renderTo(element, replace=false): void {}
        }
    
        export class DataSourceRoot extends Model {
        }
    
        DataSourceRoot.prototype.type = 'DataSourceRoot';
        DataSourceRoot.prototype.default_view = DataSourceRootView;
        DataSourceRoot.define({
            sources: [ p.Any ]
        })
        """)
    

    然后你就可以这样写:

    source_root = DataSourceRoot()
    curdoc().add_root(source_root)
    
    source_root.sources.append(ColumnDataSource(id='my-source', data=dict(a=[1])))
    

    并在JS端使用它像这样:

    // Note the unfortunate `[0]` - right now Bokeh doesn't have a way
    // to get a document by some ID
    console.log(Bokeh.documents[0].get_model_by_id('my-source').data['a']);
    

相关问题