【问题标题】:Is there a way to prevent a callback from firing in dash?有没有办法防止回调在破折号中触发?
【发布时间】:2020-06-29 16:18:53
【问题描述】:

我有以下回调:

@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

当在回调中时,有没有办法阻止另一个回调触发?为了避免这种循环依赖错误和回调之间可能的无限循环。

【问题讨论】:

    标签: python plotly-dash


    【解决方案1】:

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

    【讨论】:

    • 是否可以抑制这个异常?
    【解决方案2】:

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

    关于高级回调的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
    

    【讨论】:

      猜你喜欢
      • 2021-04-28
      • 2020-10-10
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多