动态添加的项目不会触发观察者

Dynamically added items do not trigger observers

我正在使用数组变异方法向数组添加一些项目。这些项目显示在 <dom-repeat> 中,可以即时编辑。虽然编辑确实更改了对象中的数据,但任何附加的观察器都不会触发以指示发生了更改。

tl;dr

我正确地使用数组变异方法来推送项目

this.push("data.contents", {
  id: 1,
  name: "Modifying this text doesn't trigger an observer"
});

我正在 dom-repeat

中显示项目

这些项目使用 <dom-repeat> 显示,子 属性 name 显示在 <paper-input> 中,可以随时修改。

  <template>
    <template is="dom-repeat" items="[[data.contents]]">
      <paper-input value="{{item.name::input}}"></paper-input>        
    </template>
  </template>

似乎在对象本身修改数据时,任何附加的观察者都不会为这些子属性触发。

我正在附加通配符观察者

我正在使用通常的通配符观察器进行观察,如下所示:

observers: [
  "logChange(data.*)"
],

备注

注意:

this.set("data.contents.0.name", "Foo")

会很好地触发观察者

上述内容的 MCVE。

使用方法:

<base href="https://polygit.org/components/">
<script src="webcomponentsjs/webcomponents-lite.min.js"></script>
<link href="polymer/polymer.html" rel="import">
<link href="paper-input/paper-input.html" rel="import">
<link href="paper-button/paper-button.html" rel="import">

<dom-module id="x-example">
  <template>
    <paper-button on-tap="pushItem">Push to Array</paper-button> 
    <template is="dom-repeat" items="[[data.contents]]">
      <paper-input value="{{item.name::input}}"></paper-input>        
    </template>
  </template>
  <script>
    HTMLImports.whenReady(function() {
      "use strict";

      Polymer({

        is: "x-example",
        properties: {
          data: {
            type: Object,
            value: {
              contents: []
            }
          }
        },

        observers: [
          "logChange(data.*)"
        ],

        pushItem: function() {
          this.push("data.contents", {
            id: 1,
            name: "Modifying this text doesn't trigger an observer"
          })
        },

        logChange: function() {
          console.log("change occured!");
        }

      });
    });
  </script>
</dom-module>

<x-example></x-example>

已在此处解决:https://github.com/Polymer/polymer/issues/4140#issuecomment-259465035

The observer isn't firing because you have one-way binding annotations on the items property, which prevents change notifications from flowing up to the element. Change it to: items="{{data.contents}}" and you'll see the changes.

本质上,转这个:

<template is="dom-repeat" items="[[data.contents]]">
  <paper-input value="{{item.name::input}}"></paper-input>        
</template>

至此

<template is="dom-repeat" items="{{data.contents}}">
  <paper-input value="{{item.name::input}}"></paper-input>        
</template>