Наблюдатели массива Polymer 1.0 при изменении привязки

Я пытаюсь наблюдать за изменениями в массиве объектов, которые передаются элементу Polymer. Когда в массив добавляется новый элемент, массив также изменяется в элементе Polymer. Однако метод наблюдателя никогда не вызывается.

Содержащий элемент

<dom-module is="table-container">
  <template>
    <selectable-table table-items="{{items}}"></selectable-table>
    <button on-click="addItem">Add Item</button>    
  </template>
  <script>
    Polymer({
      is : "table-container",
      attached : function() {
        this.items = [];
        for (var i = 0; i < 3; i++) {
          this.push("items", {
            numerical: "1",
            english: "one"
          });
        }
      },
      addItem : function() {
        this.push("items", {
          numerical: "3",
          english: "three"
        })
      }
    })
  </script>
</dom-module>

Попытка наблюдать изменения здесь:

<dom-module id="selectable-table>
  <template>
    <div>{{tableItems}}</div>
  </template>
  <script>
    Polymer({
      is : "selectable-table",
      properties : {
        tableItems: {
          type: Object,
          notify: true,
          observer: "updateTableItems"
        }
      }
      updateTableItems : function() {
        // Updates here
      }
    });
  </script>
</dom-module>

Метод updateTableItems сначала вызывается при первом заполнении массива элементов, но никогда при нажатии кнопки для добавления дополнительных объектов.


person j.fong    schedule 23.09.2015    source источник


Ответы (1)


Для наблюдения за изменениями в массиве используйте следующий стиль наблюдателей.

Polymer({
  is : "selectable-table",
  properties : {
    tableItems: {
      type: Array,
      notify: true,
    }
  },

  observers: [
      'updateTableItems(tableItems.*)'
  ],
  updateTableItems : function() {
    // Updates here
  }
});

Поскольку tableItems — это массив объектов, вы должны использовать тип Array в объявлении своего свойства. Используемый вами тип наблюдателя сработает только в том случае, если вы назначите новый экземпляр массива свойству tableItems. Для манипуляций с массивом добавьте свой обратный вызов в observers. Дополнительную информацию можно найти в документах.

person Maria    schedule 23.09.2015