有没有一种方法可以防止在破折号中触发回调?

时间:2020-06-29 16:18:53

标签: python plotly-dash

我有以下回调:

@app.callback(
    [Output("useridPicker", "value"), Output("datePicker", "date"), ],
    [Input("url", "search")]
)
def update_form_default(url_search):
    return 111, dt.today()


@app.callback(
    Output("url", "search"),
    [Input("useridPicker", "value"), Input("datePicker", "date")]
)
def update_current_url(userid, date):
    return f"?userid=111&date=2020-06-29"

我有一个文本区域可以选择一个用户ID(useridPicker),一个日期选择器可以选择一个日期(datePicker)和一个包含当前用户ID和当前日期作为参数的URL(“ YYYY-MM-DD”)。

当我从URL修改日期或用户ID时,我想更新(useridPicker)和(datePicker)内部的显示值。反之亦然。

目前,我收到以下错误消息:

错误:发现依赖性周期:useridPicker.value-> url.search-> useridPicker.value

在回调内部时,是否有办法防止其他回调触发?为了避免这种循环依赖性错误以及回调之间可能的无限循环。

2 个答案:

答案 0 :(得分:2)

可以通过两种方式中止Dash回调。您可以引发dash.exceptions.PreventUpdate异常以中止整个回调,也可以为每个不想更新的输出返回dash.no_update

答案 1 :(得分:1)

@emher 关于提前中止回调的选项是正确的,但这并不能解决循环回调的问题(React.jsdash 下的限制)。

有关高级回调的 dash 文档提供了一些如何避免循环回调的建议:https://dash.plotly.com/advanced-callbacks

<块引用>

从 dash v1.19.0 开始,您可以在同一个文件中创建循环更新 回调。

涉及多个回调的循环回调链不是 支持。

循环回调可用于保持多个输入同步到 彼此。

诀窍是用具有多个输出的单个回调替换您的两个回调,并在回调中使用 dash.callback_context.triggered 来检测哪些输入被修改以触发回调。您可以使用 no_update 仅更新需要更改的输出。像这样:

from dash import callback_context, no_update

@app.callback(
    Output("url", "search"),
    Output("useridPicker", "value"),
    Output("datePicker", "date"),
    Input("url", "search"),
    Input("useridPicker", "value"),
    Input("datePicker", "date"),
)
def update_form_default(url_search):
    changed_inputs = [
        x["prop_id"]
        for x in callback_context.triggered
    ]
    if "url.search" in changed_inputs:
        return no_update, 111, dt.today()
    else:
        return f"?userid=111&date=2020-06-29", no_update, no_update