はじめに の対話機能の部分でわかるように、1 つのコールバック関数は複数の入力を受け入れることができますが、出力は常に 1 つです。
入力変更後に更新する必要がある 2 つのブロックが別々にあるとします。もちろん、最も簡単な方法は、ブロックごとに同じ入力で 2 つのコールバックを作成することです。問題は、すべてのデータを取得するには 1 回で十分なのに、リクエストが 2 回実行されることです。
@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 つのリクエストで 2 つ以上の要素を出力するもっと洗練された方法があるのではないでしょうか?