Компьютерная привязка не обнаруживает изменений в списке железа
Полимер 1, у меня в железном списке:
<iron-list
id="ironList"
scroll-target="[[ironListScrollTarget]]"
items="[[itemCollectionCopy]]">
...
<div class="text center-justified info-icon">
<iron-icon
hidden="[[!_isDirtyData(item.*, itemCollectionCopy)]]"
role="img"
aria-label="Check-out information has been modified"
title="Check-out information has been modified"
icon="icons:info-outline"></iron-icon>
<iron-icon
hidden="[[_isDirtyData(item.*, itemCollectionCopy)]]"
role="img"
class="pristine-data"
aria-label="Check-out information has been modified"
title="Check-out information has been modified"
icon="icons:info-outline"></iron-icon>
</div>
_isDirtyData: function(item) {
console.log(item);
return item.base.preferences;
},
setCustomPreference: function(e) {
const id = e.detail.data.clientId;
const preferences = e.detail.data.preferences;
const foo = this.itemCollectionCopy.map((item) => {
if (item.client_id === Number(id)) {
item.preferences = preferences;
}
return item;
});
this.itemCollectionCopy = [];
this.itemCollectionCopy = [...foo];
},
При добавлении объекта настроек в item.preferences
Я не смог получить вычисленную привязку hidden="[[_isDirtyData(item.*)]]"
обнаружить изменение. Вместо этого мне пришлось добавить весь массив itemCollectionCopy
в hidden="[[_isDirtyData(item.*, itemCollectionCopy)]]"
что кажется чрезмерным.
Почему вычисляемая привязка не обнаружит изменение только hidden="[[_isDirtyData(item.*)]]"
?
1 ответ
Способ, которым полимер наблюдает за изменениями в свойствах, не идеален, и они добавили несколько методов мутаций массива, чтобы изменить массив и уведомить шаблоны об этих изменениях.
Вы можете использовать их, если они работают для вашего конкретного случая.
https://polymer-library.polymer-project.org/1.0/docs/devguide/model-data
Иногда вы хотите выполнить операцию JS-способом, или просто не существует метода мутации массива, адаптированного для вашего случая.
Существует метод notifyPath, который также может помочь.
this.notifyPath('myarray.*');
например, вызовет всех соответствующих наблюдателей.