为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2023-02-07 17:24:10
我有以下回调:@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在回调内部时,有没有办法阻止触发另一个回调?为了避免这种循环依赖错误和回调之间可能的无限循环。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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



查看完整回答
反对 回复 2023-02-07
?
三国纷争

TA贡献1804条经验 获得超7个赞

关于提前中止回调的选项是正确的,但这并不能解决循环回调的问题(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


查看完整回答
反对 回复 2023-02-07
  • 2 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信