Каков наилучший способ для создания и удаления объектов Dynami c на панели инструментов Plotly Da sh? - PullRequest
0 голосов
/ 08 марта 2020

В настоящее время у меня есть класс, в котором хранится словарь элементов Card, каждый из которых уникален. Класс также может генерировать эти карточки и добавлять их в словарь или удалять карточку из словаря. Однако я не уверен, как наилучшим образом разрешить это действие с помощью функции обратного вызова, поскольку идентификатор карты не существует до тех пор, пока карта не будет создана, а функциональность не входит непосредственно в структуру Da sh, так как словарь объект выступает в качестве посредника, где хранятся объекты.

В принципе, мне интересно, каков наилучший способ динамического создания и уничтожения объектов с помощью обратного вызова?

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Если вы хотите избежать дополнительных вычислений для построения карт, которые вы не будете использовать, я бы предложил создать a, которая создает каждую карту и сохраняет эти функции в словаре. (Вы также можете создать универсальную функцию с параметрами, которые позволяют специфичность)

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()

Вы можете сохранить карты, которые вы хотите создать в объекте d cc .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

Обратите внимание, что этот подход не разрешает удаление карточек. Это легко сделать, но, возможно, потребуется более динамичное c использование кэширования.

0 голосов
/ 09 марта 2020

Только на основании вашего вопроса у меня есть несколько немедленных предложений (поскольку вы не опубликовали рабочий код). 1. Создайте все элементы карты по умолчанию. Они могут быть сгенерированы, но не «отображены». 2. Добавьте обратные вызовы, чтобы динамически переключать отображение / рендеринг карт в зависимости от варианта использования. Таким образом у вас будут идентификаторы элементов карты, с которыми можно поиграть в колбэках.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...