短划线模式匹配回调:在输入中匹配,但在输出中不匹配



我想使用Dash模式匹配回调的MATCH作为Input,而不需要将Output连接到相同的MATCH。想象一下,我生成了一个长的、随机的项目列表,用户可以从中选择任意数量的项目。当他们选择每个项目时,我想实时地将该项目附加到列表中。这是一个1000多个项目的长列表,所以我不想看到整个ALL列表,只想看到他们实时选择的一个,所以我可以进行快速、高效的回调。

类似以下内容:

from dash import Dash, dcc, html, Input, Output, State, MATCH, ALL
import dash_bootstrap_components as dbc
app = Dash(__name__, suppress_callback_exceptions=True)
# HTML table header and rows
header = html.Thead(html.Tr([html.Th("Add Part"), html.Th("Description")]))
rows = html.Tbody(
[
html.Tr(
[
html.Td(
dbc.Button(
"Add",
id={"type": "part_add", "index": i},
n_clicks=0,
),
),
html.Td(f"Index {i}"),
]
)
for i in range(1000)
]
)
app.layout = html.Div([
dcc.Store(id="my_list", storage_type="local", data=[]),
dbc.Table(
[header, rows],
bordered=True,
striped=True,
)
])

@app.callback(
Output("my_list", "data"),
Input({"type": "part_add", "index": MATCH}, "id"),
State("my_list", "data"),
)
def match_callback_test(
part_add_id,
my_list_data 
):
return my_list_data.append(part_add_id)

如果采用不同的模式,上述可能吗?如果我运行上面的程序,我会得到一个JavaScript控制台错误。

如果使用MATCH,MATCH也需要在所有输出上。只需使用ALL并检查哪个id是用ctx触发的。工作示例:

from dash import (
Dash,
dcc,
html,
Input,
Output,
State,
MATCH,
ALL,
ctx,
exceptions,
no_update,
)
import dash_bootstrap_components as dbc
app = Dash(__name__, suppress_callback_exceptions=True)
# HTML table header and rows
header = html.Thead(html.Tr([html.Th("Add Part"), html.Th("Description")]))
rows = html.Tbody(
[
html.Tr(
[
html.Td(
dbc.Button("Add", id={"type": "part_add", "index": i}, n_clicks=0,),
),
html.Td(f"Index {i}"),
]
)
for i in range(10)
]
)
app.layout = html.Div(
[
dcc.Store(id="my_list", storage_type="local", data=[]),
dbc.Table([header, rows], bordered=True, striped=True,),
]
)

@app.callback(
Output("my_list", "data"),
Input({"type": "part_add", "index": ALL}, "n_clicks"),
State("my_list", "data"),
)
def match_callback_test(part_add_id, my_list_data):
trigger = ctx.triggered_id
if trigger:
my_list_data.append(trigger["index"])
return my_list_data
return no_update

if __name__ == "__main__":
app.run(debug=True)

最新更新