2017-08-23 116 views
3

正如我们在Interactivity part of Getting started中可以看到的那样,一个回调函数可以接受多个输入但始终具有单个输出。有没有更好的方法来用Plotly执行Dash的多个输出?

假设我们有两个单独的块,输入更改后必须更新。当然,最简单的方法是为每个块创建两个具有相同输入的回调函数。问题是请求执行两次,而一次只能获取所有数据。

@app.callback(
    dash.dependencies.Output('element_1', 'children'), 
    [dash.dependencies.Input('filter', 'value')]) 
def callback_element_1(filter): 
    return get_data(filter).el1 

@app.callback(
    dash.dependencies.Output('element_2', 'children'), 
    [dash.dependencies.Input('filter', 'value')]) 
def callback_element_2(filter): 
    return get_data(filter).el2 

我发现的解决方案是将这些元素包装在一个块中,并用一个请求重新渲染它。但是在这种情况下,包装器中的所有静态内容也会被刷新,特别是如果DOM中的初始元素彼此远离。

@app.callback(
    dash.dependencies.Output('wrapper', 'children'), 
    [dash.dependencies.Input('filter', 'value')]) 
def callback_element_wrapper(filter): 
    data = get_data(filter) 
    return html.Div(
     children=[ 
      data.el1, 
      # more static content 
      data.el2, 
     ] 
    ) 

所以也许有更优雅的方式来输出两个或多个元素与一个请求?

+1

也许这可以通过将'app.layout'设置为一个函数来实现,因此您可以使用动态布局。 查看文档[live-updates](https://plot.ly/dash/live-updates)部分中的“页面加载更新”。 – jackdbd

+0

@jackdbd,谢谢。不完全是我所需要的,但非常有用 –

回答

1

基于this, 有一种方法。

你可以做的是更新一个隐藏的“信号元素”(例如,这可以是一个文本输入),然后更新两个主要元素。

运行一次get_data(filter),并将结果存储在全局变量中。然后代替更新element_1element_2, 更新该信号元素。

result = [] 

@app.callback(
dash.dependencies.Output('signal', 'value'), 
[dash.dependencies.Input('filter', 'value')]) 
def callback_signal(filter): 
    global result 
    result = get_data(filter) 
    return filter 

@app.callback(
dash.dependencies.Output('element_2', 'children'), 
[dash.dependencies.Input('signal', 'value')]) 
def callback_element_2(filter): 
    return result.el2 


@app.callback(
dash.dependencies.Output('element_2', 'children'), 
[dash.dependencies.Input('signal', 'value')]) 
def callback_element_2(filter): 
    return result.el2 

在我的情况下,我在单用户环境中使用Dash,并且使用全局变量不是问题。如果您有多个用户同时运行应用程序,则可以使用替代方法,并且您可以在同一链接中找到它们。

+0

太好了,谢谢你,我找到了另一种方法在你提到的页面上分享它。但对我来说,看起来你的例子不清楚。如果您决定在全局变量中共享结果,则不需要创建隐藏的div。只需更改第二个和第三个回调中的输入并完全删除第一个。然后检查是否计算了“结果”,如果不是 - 调用get_data。 –

+1

我认为如果使用“示例2 - 预计算聚合”的方法更新帖子,这应该是单会话存储的接受答案。为了在应用程序之间共享结果,我们可以使用缓存(我已经使用redis完成了这个) –

+0

没错,我们可以检查全局变量的变化,但是如果它没有,它会调用'get_data'两次改变了,我需要避免在我的情况。如果这不是问题,是的,你是对的,我们可以删除它。 – Gimmly

相关问题