将 dcc.Store 连接到开关输入

问题描述 投票:0回答:1

我正在尝试使用 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'}

我知道两个回调之间存在循环。我应该如何解决这个问题,或者是否应该使用其他方法来使交换机和商店相互通信?

python plotly-dash
1个回答
0
投票

以最小版本为先决条件

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

© www.soinside.com 2019 - 2024. All rights reserved.