【问题标题】:Polymer 1.1 binding to array valuesPolymer 1.1 绑定到数组值
【发布时间】:2015-10-08 20:37:39
【问题描述】:

我有这样的表格

       <div class="warranty-part">
        <paper-input maxlength="4" name="warranty[0]" no-label-float label="1111" value="{{warranty0::input}}"></paper-input>
      </div>
      <div class="warranty-part">
        <paper-input maxlength="4" name="warranty[1]" no-label-float label="1111" value="{{warranty1::input}}"></paper-input>
      </div>
      <div class="warranty-part">
        <paper-input maxlength="4" name="warranty[2]" no-label-float label="1111" value="{{warranty2::input}}"></paper-input>
      </div>
      <div class="warranty-part">
        <paper-input maxlength="4" name="warranty[3]" no-label-float label="1111" value="{{warranty3::input}}"></paper-input>
      </div>

有四个不同的字段。这些输入值中的每一个都绑定到一个定义为...的属性...

   properties: {

    warranty0: {
      type: String,
      observer: 'onWarrantyChange0'
    },

     warranty1: {
      type: String,
      observer: 'onWarrantyChange1'
    },

     warranty2: {
      type: String,
      observer: 'onWarrantyChange2'
    },

     warranty3: {
      type: String,
      observer: 'onWarrantyChange3'
    }
  }

这行得通...但是更整洁的是能够绑定到每个字段的数组值以整理内容。

喜欢

properties: {

    warranty: {
      type: Array,
      value: ['','','',''],
      observer: 'onWarrantyChange'
    }
  }

但我只是不知道如何用聚合物绑定到数组的索引。通过阅读文档,我得到的印象是像这样绑定到输入值会起作用......

    value="{{warranty.0::input}}"

但事实并非如此。

有什么办法吗?

【问题讨论】:

    标签: polymer polymer-1.0


    【解决方案1】:

    试试{{warranty.0}}{{warranty.1}}等。

    但是,如果您更新任何paper-inputvalue,则不会调用onWarrantyChange 观察者,因为您需要特殊的* 语法来通知数组内的属性更改(请参阅@987654321 @)。

    properties: {
      warranty: {
        type: Array,
        value: ['111','222','333','444']
      }
    },
    
    observers: ['onWarrantyChange(warranty.*)'],
    
    onWarrantyChange: function (changedWarranty) {
      console.log(changedWarranty);
    }
    

    请参阅此plunker 以供参考。


    更新

    看起来 Polymer 可能会被 valued type 字符串文字的绑定混淆。所以一个简单的解决方法是定义一个包含 4 个对象的数组 -

    value: [ { value: '' }, { value: '' }, { value: '' }, { value: '' } ]
    

    绑定会变成-

    value="{{warranty.0.value}}"value="{{warranty.1.value}}"等。

    查看这个新的plunker

    【讨论】:

    • 非常感谢您的回答!!这是处理它的好方法。我发现的唯一一件事是,当您将数组值作为空字符串启动时,所有值都绑定到最后一个数组值。例如plnkr.co/edit/y5nGZGHnSjvnKVz4TWPK?p=preview
    • 因为这些字符串文字是 equal 彼此的,这让 Polymer 感到困惑,它总是选择最后一个进行更新(参见 Polymer.html 中的这一行 var key = coll.getKey(old);)。所以也许将value 更改为[new String(), new String(), new String(), new String()]。但是,这样做会使paper-input 失去默认的label 显示。在您的特定情况下,由于您拥有no-label-float,因此一个快速的解决方案可能是简单地使用placeholder 而不是label,因为它们具有确切的外观和感觉。见this
    • 实际上,更好的方法可能是用 4 个 objects 定义数组,以便它们是引用类型的。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多