Vaadin Combo-Box: использование свойства value для передачи индекса выбранного элемента

Я пытаюсь различить индекс # шаблона, выбранного в поле со списком. Мне нужно передать это значение индекса для другой функции для чтения из файла в правильном месте. По сути, выбор шаблона в выпадающем списке позволит мне найти спецификации, связанные с выбранным шаблоном на основе индекса. Насколько мне известно, Vaadin Combobox не имеет индекса, связанного с элементами комбинированного списка, но вы можете передать значение, отличное от отображаемого ярлыка: https://vaadin.com/docs/-/part/elements/vaadin-combo-box/vaadin-combo-box-basic.html (см. Использование объектов в качестве элементов). Это решение, которое я пытаюсь реализовать, однако оно становится сложным, потому что я динамически заполняю элементы комбинированного списка из файла JSON.

Код для динамического заполнения элементов:

paver = document.querySelector('#paver');
    //alert('script executed');
    patterns = [];
    familyind=y;


    $.getJSON('menu.json').done(function(data){
        //alert('getJSON request succeeded!');

        family = (data.gui[x].family[y].display);

         for(ind = 0; ind < data.gui[x].family[y].pattern.length; ind++){

            var patternLbl = data.gui[x].family[y].pattern[ind].name;
            var patternObj = '{ pattern: { label: "' + patternLbl + '", value: ' + ind + ' } }';

            patterns[ind] = patternObj;
        }
        document.getElementById("cb1").items=patterns;

         })
        .fail(function(jqXHR, textStatus, errorThrown) 
            { 
                alert('getJSON request failed! ' + textStatus); 
            })
        .always(function() { }};

HTML для ComboBox

<div id="patternSelect">
            <template is="dom-bind" id="paver">
              <div class="fieldset">
               class="patterns" items="[[patterns]]" item-label-path="pattern.label" item-value-path="pattern.value"></vaadin-combo-box>
              </div>
            </template>
        </div>

Вывод, который я получаю, когда пытаюсь выполнить это, состоит в том, что вся построенная строка собирается в мои варианты выбора. Теоретически этого не должно было произойти, потому что item-value-path и item-label-path были указаны при объявлении комбинированного списка.Скриншот вывода Сломанные ярлыки

Тамнаписано: {pattern: {label: "A-3 Piece Random", значение: 0 } }

РАБОТА К ПУТИ РЕШЕНИЯ:

___________(27 апреля, 7:00 вечера)___________

Предлагаемое решение для использования,

var patternObj = { pattern: { label: patternLbl, value: ind } };

отлично работает при отображении меток: Рабочие метки

Тем не менее, я использую триггер, чтобы определить, когда значение в поле со списком изменяется, и вернуть новое значение. Вот код для триггера:

// select template
var paver = document.querySelector('#paver');

// define the ready function callback
paver.ready = function () {
    // use the async method to make sure you can access parent/siblings
    this.async(function() {
    // access sibling or parent elements here
    var combobox = document.querySelector('#cb1')

    combobox.addEventListener('value-changed', function(event) {

    // FOR REFERENCE LOG ERRORS, THIS COMMENT IS ON HTML:215    
       console.log(event.detail.value);
       patval = event.detail.value;
       console.log(patval)

        // Do stuff with fetched value


        });
    });
};

Я внес предлагаемое изменение в использование триггера "значение изменено". Это работает очень хорошо с двумя небольшими проблемами. Во-первых, он возвращает каждый из вызовов журнала консоли дважды (не уверен, почему дважды). Во-вторых, когда я выбираю первый элемент комбинированного списка, он возвращает мои значения, но не устанавливает метку как выбранную. Это не проблема с другими элементами поля со списком, но первый элемент должен быть выбран дважды, чтобы установить метку. Пожалуйста, посмотрите это короткое видео для демонстрации: https://youtu.be/yIFc9SiSOUM. Этот графический сбой может сбить с толку пользователя, так как он будет думать, что не выбрал шаблон, когда знает, что у него есть. Ищите решение, чтобы убедиться, что метка установлена ​​при выборе первого элемента.

1 ответ

Вы устанавливаете строку в patternObj в то время как вы должны установить объект.

Попробуйте использовать любой var patternObj = JSON.parse('{ pattern: { label: "' + patternLbl + '", value: ' + ind + ' } }'; или даже проще: var patternObj = { pattern: { label: patternLbl, value: ind } };

Кроме того, я бы рекомендовал инициализировать patterns = [] внутри done обратный вызов, чтобы убедиться, что вы не оставляете старые предметы в patterns когда данные меняются.

Другие вопросы по тегам