在 Plotly Dash 仪表板中允许动态对象创建和删除的最佳方法是什么?
What is the best way for allowing for dynamic object creation and removal in a Plotly Dash dashboard?
目前,我有一个 class,它存储一个 Card 元素的字典,每个元素都是唯一的。 class 也可以生成这些卡片并将它们附加到字典中或从字典中删除卡片。但是,我不确定如何通过回调函数最好地允许此操作,因为在制作卡片之前卡片的 ID 不存在,并且该功能不直接在 Dash 框架中,因为字典对象充当存储对象的中介。
基本上,我想知道使用回调动态创建和销毁对象的最佳方法是什么?
谢谢!
根据您的问题,我有一些直接的建议(因为没有您发布的工作代码)。
1.默认生成所有卡片元素。它们可以生成,但不能 'displayed'
2. 添加回调以根据用例动态切换卡片的 display/rendering。这样您就可以在回调中使用卡片元素 ID。
希望这对您有所帮助。
假设您想避免为不使用的卡片进行额外计算,我建议创建一个创建每张卡片并将这些函数存储在字典中的函数。 (您也可以创建一个带有允许特定性的参数的通用函数)
my_card_functions = {
'id_1': make_id_1,
'id_2': make_id_2,
}
可以这样创建卡片:
my_id = 'id_1'
f = my_card_functions[my_id] # will break if id isn't registered
my_card = f()
您可以将要创建的卡片存储在 dcc.store 对象中。以下是您可能会考虑的一些代码示例:
# Pretend these are structured properly
dcc.Store(id='cards_data')
html.Div(id='my_cards',children=[])
@app.callback(
Output('my_cards','children'),
[Input('cards_data','data')],
[State('my_cards','children')]
)
def make_cards(data, children):
"""Makes cards for each id"""
if not data:
raise PreventUpdate
# The following code is not correct but serves as a demonstrative example
# Some data structure manipulation is necessary to access
# the ids from the children elements
children_ids = [x['id'] for x in children]
# Assuming your data looks something like this:
# {'add':['id_1','id_2']}
for x in data['add']:
if x not in children_ids:
f = my_card_functions[my_id]
my_card = f()
# Store values
children.append(my_card)
return children
请注意,此方法无法解决移除卡片的问题。这很容易做到,但可能需要更动态地使用缓存。
目前,我有一个 class,它存储一个 Card 元素的字典,每个元素都是唯一的。 class 也可以生成这些卡片并将它们附加到字典中或从字典中删除卡片。但是,我不确定如何通过回调函数最好地允许此操作,因为在制作卡片之前卡片的 ID 不存在,并且该功能不直接在 Dash 框架中,因为字典对象充当存储对象的中介。
基本上,我想知道使用回调动态创建和销毁对象的最佳方法是什么?
谢谢!
根据您的问题,我有一些直接的建议(因为没有您发布的工作代码)。 1.默认生成所有卡片元素。它们可以生成,但不能 'displayed' 2. 添加回调以根据用例动态切换卡片的 display/rendering。这样您就可以在回调中使用卡片元素 ID。
希望这对您有所帮助。
假设您想避免为不使用的卡片进行额外计算,我建议创建一个创建每张卡片并将这些函数存储在字典中的函数。 (您也可以创建一个带有允许特定性的参数的通用函数)
my_card_functions = {
'id_1': make_id_1,
'id_2': make_id_2,
}
可以这样创建卡片:
my_id = 'id_1'
f = my_card_functions[my_id] # will break if id isn't registered
my_card = f()
您可以将要创建的卡片存储在 dcc.store 对象中。以下是您可能会考虑的一些代码示例:
# Pretend these are structured properly
dcc.Store(id='cards_data')
html.Div(id='my_cards',children=[])
@app.callback(
Output('my_cards','children'),
[Input('cards_data','data')],
[State('my_cards','children')]
)
def make_cards(data, children):
"""Makes cards for each id"""
if not data:
raise PreventUpdate
# The following code is not correct but serves as a demonstrative example
# Some data structure manipulation is necessary to access
# the ids from the children elements
children_ids = [x['id'] for x in children]
# Assuming your data looks something like this:
# {'add':['id_1','id_2']}
for x in data['add']:
if x not in children_ids:
f = my_card_functions[my_id]
my_card = f()
# Store values
children.append(my_card)
return children
请注意,此方法无法解决移除卡片的问题。这很容易做到,但可能需要更动态地使用缓存。