Динамически добавлять Eventlistener в комбинированный ящик vaadin в Polymer Datatable

Я пытаюсь прослушать изменения, внесенные в комбинированный список vaadin (значение) внутри таблицы данных железа.

Это мой полный Datatable:

<iron-data-table  id="grid4" items="[[riskCombined]]" selection-enabled on-selected-items-changed="_selected" >
  <data-table-column name="#" width="20px" flex="0">
   <template>
        <div class="index">[[item]]</div>
      </template>
      </data-table-column>
    <data-table-column name="Risk" width="140px" flex="0">
      <template>[[item.name]]</template>
    </data-table-column>
    <data-table-column name="State" width="100px" flex="0">
    <template><vaadin-combo-box value=[[item.state]] items=[[item.settings]] on-value-change="valueChanged" id=combobox[[index]]> </vaadin-combo-box></template>
</data-table-column>  
  </iron-data-table>

Я хочу слушать изменения значения:

  <data-table-column name="State" width="100px" flex="0">
  <template>
  <vaadin-combo-box value=[[item.state]] items=[[item.settings]] on-value-  change="valueChanged" id=combobox[[index]]> </vaadin-combo-box>
  </template>
  </data-table-column> 

Я добавляю список событий:

 <script>   
 var combobox = document.querySelector('vaadin-combo-box');
    combobox.addEventListener('value-changed', function(event) {
      console.log(event.detail.value);
    });

    combobox.addEventListener('selected-item-changed', function(event) {
      console.log(event.detail.value);
    });
 </script>

также пробовал с:

document.getElementById(...)

Проблема в том, что Eventlistener просто добавляется в первый комбинированный список. Но поскольку динамически создаются несколько ящиков, это не работает. Как я могу динамически добавить Eventlistener в несколько списков? Или есть другое решение?

Изменить: попробовал это:

valueChanged: function(event) {
        console.log(event.detail.value);
      }

Изменить 2:

изменено

on-value-change="valueChanged"

в

on-value-changed="valueChanged"

Теперь edit1 работает! Но он срабатывает уже при первой загрузке страницы и устанавливает значения в выпадающем списке...

2 ответа

Правильный способ заключается в использовании on-value-changed (обратите внимание на атрибут changeD) внутри шаблона. Использование querySelector ненадежно, так как могут быть новые элементы, добавляемые позже, когда таблица прокручивается.

Поскольку элементы перерабатываются и используются повторно, к новой <vaadin-combo-box> элементы при прокрутке - следовательно, стрельба value-changed события каждый раз, когда ряд перерабатывается.

Предполагая, что вы хотите, чтобы пользователь мог изменить item.state собственность, я предлагаю вам вместо этого связать это свойство с value="{{item.state}}" и добавить слушателя для события item-changed,

Смотрите мой пример здесь: http://jsbin.com/heroqu/edit?html,console,output

item-changed кажется, запускается всегда дважды, но все равно должно быть в порядке.

Ваадин-комбо-бокс уже срабатывает value-changed событие, когда value изменения. Вы можете слушать value-changes событие вместо создания собственного события. Вот документация для vaadin-combo-box,

listeners:{'value-changed':'valueChanged'},
valueChanged:function(e){
  //code goes here
}
Другие вопросы по тегам