有没有办法防止回调在破折号中触发?

我有以下回调:


@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 和当前日期(“YYYY-MM-DD”)作为参数的 url。


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


现在,我收到以下错误:


错误:发现依赖循环:useridPicker.value -> url.search -> useridPicker.value


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


幕布斯6054654
浏览 115回答 2
2回答

largeQ

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

三国纷争

关于提前中止回调的选项是正确的,但这并不能解决循环回调的问题(React.jsunderneith中的限制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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python