Удалить опцию из всех других выпадающих в Dash - PullRequest
0 голосов
/ 24 февраля 2020

Когда какой-либо параметр выбран из какого-либо одного раскрывающегося списка, я хочу, чтобы тот же параметр был удален из всех остальных раскрывающихся списков.

Чтобы помочь визуализировать это, я пытаюсь построить преобразователь столбцов. Для каждого имени столбца слева есть выпадающий список справа, где пользователь выберет имя столбца из загруженного файла, которое соответствует имени слева. Поскольку исходный и целевой столбцы имеют отношение один к одному, когда имя столбца выбирается из одного из раскрывающихся списков, его можно удалить из всех остальных.

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

def generate_output_callback(input_id):
    def dd_callback(input_values, state):
        if not input_values:
            print('Preventing update.'.upper())
            raise PreventUpdate
        else:
            print(f'callback ran for dropdown {input_id}')
            for val in input_values:
                if val:
                    try:
                        i = state.index({'label': val, 'value': val})
                        del state[i]
                    except ValueError:
                        pass
            return state
    return dd_callback


all_cols = ['ACCTNUMBER', 'col2', 'col3']
inputs = {}
for col in all_cols:
    inputs[col] = Input(col, 'value')
all_other_inputs_dict = {k:v for (k,v) in inputs.items() if k != 'ACCTNUMBER'}
all_other_inputs = list(all_other_inputs_dict.values())
cb = generate_output_callback('ACCTNUMBER')
app.callback(
    Output('ACCTNUMBER', 'options'),
    all_other_inputs,
    [State('ACCTNUMBER', 'options')])(cb)

1 Ответ

0 голосов
/ 27 февраля 2020

Я бы сбросил ваш обратный вызов. Это уже довольно сложно, и вам все еще нужно добавить больше выпадающих. Логика c, в которой вы нуждаетесь, потребует, чтобы каждый раскрывающийся список влиял на все остальные раскрывающиеся списки, которые могли бы легко стать oop без правильной структуры.

Для этого будет работать скрытый элемент. Скрытый элемент будет содержать все допустимые выпадающие значения. Каждый обратный вызов будет слушать его и обновлять свои options реквизиты на его основе. Когда пользователь выбирает столбцы из различных раскрывающихся списков, скрытый элемент, который должен прослушивать все реквизиты value раскрывающихся списков, будет обновляться для удаления уже выбранных элементов. Если пользователь отменяет выбор столбца из раскрывающегося списка, скрытый элемент может добавить его обратно, и все параметры будут обновлены, чтобы добавить его обратно.

...