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

时间:2016-02-19 08:43:42

标签: data-binding polymer polymer-1.0

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

我希望看到我的输出更改以响应选择不同的菜单项。但相反,我在输出中看不到任何反应。

要重新创建问题,请按以下步骤操作。

  1. Open this jsBin
  2. 请注意,两个输出( Dom-repeat Computed )正确反映了所选菜单项“bar”和“qux”。
  3. 选择(或取消选择)菜单项。
  4. 注意 Dom-repeat 会做出适当的响应。
  5. ❌注意 Computed 根本没有回复。
  6. 什么代码使 Computed 响应子属性ob.selected中的更改?

    http://jsbin.com/piheyivofu/edit?html,output
    <!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>
    

1 个答案:

答案 0 :(得分:4)

了解对象标识非常重要。今天,Polymer认为Object的价值是它的身份。如果x == 2,并且我设置x = 4,则x已更改值。如果ob = {foo:3},并且我设置了ob.foo = 4,则ob 更改了值(它的身份未被更改)并且此更改将不会触发对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.* info返回观察ob.*有关于ob发生了什么的信息。