2017-08-23 117 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

相關問題