Компьютерная привязка не обнаруживает изменений в списке железа

Полимер 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.*'); 

например, вызовет всех соответствующих наблюдателей.

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