2016-03-28 195 views
1

我有一個複雜的屬性,我想在聚合物中觀察。嵌套陣列觀察聚合物

該屬性包含嵌套陣列,其似乎不使用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 
    ], 

它爲我提供了所有的也改變了父母。

爲了解我目前的使用情況,我在changeRecordpath上進行了大量的字符串匹配,以查看哪條路徑實際發生了變化以及如何,但是看起來絕對是可怕的。

有沒有更好的方式去改變它而不改變我使用的數據結構?

回答

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); 
    } 
} 

(可能是更緊湊,我添加了一個名爲變量澄清比賽組的內容)。

+0

謝謝,這與我目前用來解決此問題的情況類似。我想知道是否有這樣做的實際「官方方式」/銀彈。 –