15

はじめに の対話機能の部分でわかるように、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 つ以上の要素を出力するもっと洗練された方法があるのではないでしょうか?

4

4 に答える 4

11

現在、Plotly Dash は単一のイベントで複数の出力をサポートしています。これは、dash==0.38.0rc1 の最新バージョンです。

@app.callback(
    [
        Output('output1', 'children'), 
        Output('output2', 'children')
    ],
    [
        Input('output-btn', 'n_clicks'),
        State('output-btn', 'n_clicks_timestamp')
    ]
)
def on_click(n_clicks, n_clicks_timestamp):
    if n_clicks is None:
        raise PreventUpdate

    return n_clicks, n_clicks_timestamp

Git サンプル

于 2019-06-19T04:15:02.650 に答える
2

マルチ出力コールバックのサポートが Dash に統合されました (2019/03/01)。

于 2019-03-14T18:44:25.067 に答える