在 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

请注意,此方法无法解决移除卡片的问题。这很容易做到,但可能需要更动态地使用缓存。