Polymer中的嵌套数组观察

时间:2016-03-28 08:04:15

标签: javascript polymer polymer-1.0

我有一些复杂的属性,我想在Polymer中观察。

该属性包含嵌套数组,这些数组似乎不支持使用observers进行观察,因为它们似乎只能使用1级嵌套(即只有一个数组)干净利落地工作在道具中。

这是一个例子:

  Polymer({
    is: 'house-component',

    properties: {

      house: {
        type: Object,
        value: {
          parents: [
            {
              name: "BigFoo",
              children: [
                { name: "SmallFoo", age: 12 },
                { name: "SmallBaz", age: 15 },
                { name: "SmallSid", age: 17 }
              ]
            },
            {
              name: "BigBaz",
              children: [
                { name: "SmallIda", age: 11 },
                { name: "SmallTed", age: 18 },
                { name: "SmallMoe", age: 16 }
              ]
            }
          ]
        }
      }
    }

我如何专门监控以下操作(仅举例):

  • 更改任何孩子的年龄。
  • 任何父母添加/删除子女。

理想情况,我可以在这些方面有所建议:

    observers: [
      "_childAgeChanged(house.parents.*.children.*.age)",
      "_childrenChanged(house.parents.*.children)"
    ],

这是我目前使用的:

    observers: [
      "_childrenChanged(house.parents.*)" // basically observes almost everything
    ],

为我提供所有对父母的更改。

为了解决我目前使用的问题,我在changeRecord的{​​{1}}上进行了大量的字符串匹配,以查看哪条路径实际发生了变化以及如何改变,但它看起来绝对可怕。

有没有更好的方法来改变我正在使用的数据结构?

1 个答案:

答案 0 :(得分:1)

这里没有灵丹妙药,通配符只能在路径的末尾使用,所以最好的选择就是你正在做的事情 - 指定house.parents.*并过滤path

我确信还有其他方法可以做到这一点,但如果你在观察者中使用一对正则表达式并不是太糟糕了:

var splicesRe = /house\.parents\.([^.]*)\.children\.splices/
var ageRe = /house\.parents\.([^.]*)\.children\.([^.]*)\.age/

var match;
match = change.path.match(splicesRe);
if (match) {
    var parentKey = match[1];
    childrenChanged(parentKey, change);
}
else {
    match = change.path.match(ageRe);
    if (match) {
        var parentKey = match[1];
        var childKey = match[2];
        var newAge = change.value;
        childAgeChanged(parentKey, childKey, change.value);
    }
}

(可能更紧凑;我添加了命名变量以阐明匹配组的内容。)