2013-05-01 18 views
19

私は、列挙可能なmixinが'[]'プロパティに依存する計算されたプロパティを持っていることに気付きました。一方、ember配列も'@each'プロパティを持っています。ember.jsの '[]'プロパティと '@each'プロパティの違いは何ですか?

'[]''@each'の違いは何ですか?

私が間違っていると私を曖昧に理解すると、アレイの内容が置き換えられたときに'[]'がトリガーされます。しかし、それは財産そのものに依存するよりも違うのでしょうか?

は、以下のクラス考えてみましょう:

C = Ember.Object.extend({ 
    things: null, 
    watcher1: (function() { 
    console.log('watcher1') 
    }).observes('things.[]'), 
    watcher2: (function() { 
    console.log('watcher2') 
    }).observes('[email protected]') 
}); 

を、次のように、私はインスタンスを作成します。

c = C.create({things: Ember.A(['a', 'b'])}); 

c.get('things').replace(0, 1, ['z']) 

watcher1watcher2

をトリガー

そして、次のとおり行い

c.get('things').setObjects(['1', '2']) 

watcher1watcher2

をトリガー:

c.get('things').addObject('v') 

だからどんな違いがあるのでしょうか?いつ他のものを使うべきですか?

ありがとうございます! ケビン

答えて

25

使用@eachあなたは配列要素の性質を観察する必要がある場合

@eachは、配列内の要素の性質を観察サポートしています。たとえば、[email protected]です。ブラケット記法はこれをサポートしていません。ここにはjsbin demoがあります。

@eachは、property of Array instancesであり、委任を処理するEachProxy instanceを返します。一方、[]は単にreturns thisです。

あなたはそれが非アレイenumerablesで作業する必要がある場合は使用[]

燃えさしのchangelogによると、ブラケット表記は0.9.8に再度有効その後、燃えさし0.9.4@eachの賛成で亡きなされたが、 。 The commit that re-enables itは、[]Ember.Setインスタンスのような非配列の列挙型に使用できることを示します。 jsbin demo

+0

ありがとうございます!非常に徹底した、私はjsbinsに感謝します。 –

+1

現行の公式文書 - http://emberjs.com/api/classes/Ember.Array.html#property__eachは、いつどのファイルを使用するかを明確にしています。 –

関連する問題