2016-03-28 16 views
1

私はポリマーで観察したいと思うような複雑な性質があります。入れ子になった配列の観察

プロパティは、それらが唯一(プロプですなわちだけつのアレイ)をネストのみ1レベルときれいに動作するように見えるようobserversを用いた観察のためにサポートされていないようネストさ配列を含有します。

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: [ 
         "_childrenChanged(house.parents.*)" // basically observes almost everything 
        ], 
    

    すべてで私を提供する:

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

    これは私が現在使用しているものである。理想的には

は、私はこれらの線に沿って何かを持っている可能性があり両親にも変わります。

私が現在使用しているものをハックするには、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

ありがとう、これは私が現在この問題を回避するために使用しているものと似ています。これを行うための実際の「公式の道」/銀色の弾丸があるかどうか疑問に思っていた。 –

関連する問題