Элемент не обновляется при изменении данных
У меня есть vaadin-checkbox
:
<vaadin-checkbox id=[[item.id]] disabled="true" checked="[[item.checked]]">[[item.description]]</vaadin-checkbox>
Я определил свои свойства:
static get properties() {
return {
items: {
type: Array,
notify: true,
value: function() {
return [];
}
}
};
}
Когда я сейчас изменяю данные нажатием какой-то кнопки:
_selectItem(event) {
const item = event.model.item;
if (item.checked === true) {
this.$.grid.deselectItem(item);
} else {
this.$.grid.selectItem(item);
}
item.checked = !item.checked;
}
Состояние флажка по-прежнему checked="true"
, Почему флажок не обновляется? То же самое, когда я меняю описание предмета:
_selectItem(event) {
event.model.item.description = 'test';
}
test
описание никогда не появляется. Флажок никогда не обновляется.
1 ответ
Решение
Причина, по которой флажок не обновляется обработчиком нажатия кнопки, заключается в системе данных Polymer 2. Polymer не обнаруживает изменения и не обновляет шаблон соответственно.
Чтобы внести изменения так, чтобы Polymer обнаружил их, у вас есть два варианта:
- использование
this.set(`items.${event.model.index}.checked`, !item.checked)
если вы можете с уверенностью предположить, чтоindex
использованdom-repeat
всегда соответствует индексу этого элемента вitems
массив (это не тот случай, если вы используете функции сортировки или фильтрацииdom-repeat
). Смотрите пример здесь https://jsfiddle.net/vlukashov/epd0dn2j/ - Если вы не знаете индекс обновленного элемента в
items
массив, вы также можете использоватьPolymer.MutableData
Mixin и уведомить Polymer,что что- то изменилось внутриitems
массив без указания индекса измененного элемента. Это делается по телефонуthis.notifyPath('items')
после внесения изменений. Однако это требует, чтобы ваш элемент расширялPolymer.MutableData
миксин, и этоdom-repeat
имеетmutable-data
набор атрибутов. Смотрите пример здесь: https://jsfiddle.net/vlukashov/epd0dn2j/24/
Больше информации об этом в Документах Polymer 2.