我有以下回调:
@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
在回调内部时,是否有办法防止其他回调触发?为了避免这种循环依赖性错误以及回调之间可能的无限循环。
答案 0 :(得分:2)
可以通过两种方式中止Dash回调。您可以引发dash.exceptions.PreventUpdate
异常以中止整个回调,也可以为每个不想更新的输出返回dash.no_update
。
答案 1 :(得分:1)
@emher 关于提前中止回调的选项是正确的,但这并不能解决循环回调的问题(React.js
在 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