我正在尝试使用 Dash Mantine 开关组件,并且我正在尝试在会话中连接 dcc.Storage。 尽管我在控制台中收到依赖循环错误,但我的解决方案有效。
这是我在 main.py 中初始化的 dcc.Store:
dcc.Store(id="is_3d", data=False, storage_type="session")
这是开关的代码:
dmc.Switch(
id="switch-3d",
size="lg",
radius="sm",
label="use the new algorithm",
)
这些是我用来连接开关值和存储值的回调:
@ callback(Output("switch-3d", "checked"), Input("is_3d", "data"))
def initSwitch(data, n_clicks, checked):
return data if n_clicks == 1 else checked
@ callback(Output("is_3d", "data"), Input("switch-3d", "checked"))
def changeState(checked):
return checked
第一个回调意味着从会话中存储的现有存储数据初始化开关检查值
第二个回调意味着根据开关检查值更改存储值。
这是我得到的错误:
{message: 'Circular Dependencies', html: 'Error: Dependency Cycle Found: is_3d.data -> switch-3d.checked -> is_3d.data'}
我知道两个回调之间存在循环。我应该如何解决这个问题,或者是否应该使用其他方法来使交换机和商店相互通信?
以最小版本为先决条件
dash v1.19.0
,可以在单个回调中处理这种相互依赖关系(带有示例的文档)。将所有受影响的组件指定为输入和输出。使用上下文 (ctx
) 来识别源组件。对所有输出使用相应参数的值。
示例:
from dash import ctx
@callback(
Output('is_3d', 'data'),
Output('switch-3d', 'checked'),
Input('is_3d', 'data'),
Input('switch-3d', 'checked'))
def changeState(session_data, layout_data):
triggered_from_layout = (ctx.triggered_id == 'switch-3d')
if triggered_from_layout:
return layout_data, layout_data
return session_data, session_data