2013-05-01 1 views
19

Ho notato che l'enumerable mixin ha proprietà calcolate che dipendono dalla proprietà '[]', mentre gli array ember hanno anche la proprietà '@each'.Qual è la differenza tra la proprietà '[]' e la proprietà '@each' in ember.js?

Qual è la differenza tra a seconda di '[]' e '@each'?

La mia vaga comprensione (correggimi se ho torto) è che '[]' viene attivato quando il contenuto dell'array viene sostituito. Ma questo è diverso rispetto alla proprietà stessa?

Si consideri la seguente classe:

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

E creare un'istanza come segue:

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

la seguente:

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

innesca watcher1 e watcher2

E la seguente:

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

innesca anche watcher1 e watcher2

Come fa:

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

Quindi c'è qualche differenza? Quando dovremmo usare l'uno contro l'altro?

Grazie! Kevin

risposta

25

Usa @each se è necessario osservare le proprietà di elementi di un array

@each supporta osservando proprietà degli elementi all'interno della matrice. Ad esempio, [email protected]. La notazione delle parentesi non supporta questo. Ecco un jsbin demo.

@each è un property of Array instances che restituisce un EachProxy instance che gestisce la delega. D'altra parte, [] semplicemente returns this.

Usa [] se ne avete bisogno di lavorare su non-Array enumerables

Secondo il changelog brace, la notazione staffa è stato fatto defunta a favore di @each in brace 0.9.4, ma poi nuovamente abilitate nel 0.9.8 . The commit that re-enables it indica che è possibile utilizzare [] per le enumerazioni non Array come le istanze Ember.Set. jsbin demo.

+0

Grazie! Molto completo e chiaro e apprezzo i jsbins. –

+1

L'attuale documentazione ufficiale - http://emberjs.com/api/classes/Ember.Array.html#property__each rende abbastanza chiaro quando utilizzare quale. –