Polymer 1.x:数据绑定到子属性

Polymer 1.x: Databinding to sub-properties

我想将数据绑定到对象的子属性。

我希望看到我的输出随着 select 不同菜单项的变化而变化。但是,我在输出中没有看到任何响应。

要重现问题,请按照以下步骤操作。

  1. Open this jsBin.
  2. 注意两个输出(Dom-repeatComputed)正确反映了 selected 菜单项"bar" 和 "qux".
  3. Select(或取消select)一个菜单项。
  4. 通知 Dom-重复 适当响应。
  5. ❌ 注意 Computed 根本没有响应。

什么代码使Computed响应子属性的变化ob.selected?

http://jsbin.com/piheyivofu/edit?html,输出
<!doctype html>
<head>
  <meta charset="utf-8">
  <base href="https://polygit.org/components/">
  <script src="webcomponentsjs/webcomponents-lite.min.js"></script>
  <link href="paper-menu/paper-menu.html" rel="import">
  <link href="paper-item/paper-item.html" rel="import">
</head>
<body>

<x-element></x-element>

<dom-module id="x-element">
<template>
  <style>
    iron-selector > * {
      padding: 8px;
    }
    .iron-selected {
      background-color: blue;
      color: white;
    }
  </style>

  <br><br>
  <paper-menu multi attr-for-selected="name" selected-values="{{ob.selected}}">
    <paper-item name="foo" >Foo</paper-item>
    <paper-item name="bar" >Bar</paper-item>
    <paper-item name="baz" >Baz</paper-item>
    <paper-item name="qux" >Qux</paper-item>
    <paper-item name="quux">Quux</paper-item>
  </paper-menu>
  <p>
    <strong>Dom-repeat</strong>:
    <template is="dom-repeat" items="{{ob.selected}}">
      <span>[[item]] </span>
    </template>
  </p>
  <p><strong>Computed</strong>: {{str}}</p>
</template>
<script>
  Polymer({
    is: 'x-element',
    properties: {
      ob: {
        type: Object,
        value: function() {
          return {
            selected: ['bar', 'qux'],
          }
        }
      },
      str: {
        type: String,
        computed: '_computeStr(ob)',
      }
    },
    _computeStr: function(temp) { // Doesn't respond to changes in temp.selected
      return temp.selected.join(', ');
    },

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

了解 对象身份 很重要。今天,Polymer 将对象的值视为它的身份。如果 x == 2,而我设置 x=4,则 x 的值已更改。如果 ob = {foo:3},并且我设置 ob.foo = 4,ob 有 not 改变值(它的身份没有改变)并且这个改变不会触发对 ob 的观察。

相反,我们可以直接观察 ob.foo,或者通过 ob.* 观察 ob 的所有子属性,或者,如果它是一个数组,则观察 ob 的长度 (ob.length)。 这样的事情会起作用,例如:

     str: {
       type: String,
       computed: '_computeStr(ob, ob.*)',
     }
   },
   _computeStr: function(temp, info) {    
      return temp.selected.join(', ');
   },

这是有效的,因为我已经要求在 ob 的 子属性发生变化时得到通知...这是 ob.* 返回的 infoob.* 的观察包含关于 ob.

发生的事情的信息