2012-04-02 13 views

risposta

11

Ember.js utilizza il concetto di un RunLoop per consentire associazioni, osservatori e così via.

Il problema con l'esempio è che impostando una proprietà (associata) e ottenendo immediatamente il valore tramite console.log non viene generato alcun evento che attiva il RunLoop e quindi sincronizza le modifiche. Ci sono 2 post di blog eccellenti su RunLoop: Part 1 e Part 2. Sebbene abbiano come target Sproutcore, il concetto è lo stesso per Ember.js.

Ci sono due modi per far funzionare il tuo esempio.

sincronizzazione Forza via Ember.run.sync()

Come dichiarano documenti, invocando Ember.run.sync()... è un modo utile per forzare immediatamente tutti gli attacchi nella domanda per sincronizzare. Questo lascia il codice come questo, vedere http://jsfiddle.net/pangratz666/cwR3P/

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.husband.get('householdIncome')); // 80000 

// Someone gets raise. 
App.husband.set('householdIncome', 90000); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.wife.get('householdIncome')); // 90000​ 

o la seconda opzione è quella di ...

mostrare i valori in una visualizzazione

mostra le proprietà di una vista gestisce tutto il materiale RunLoop per te, vedi http://jsfiddle.net/pangratz666/Ub97S/

Java Script:

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// invoke function in 3000ms 
Ember.run.later(function() { 
    // someone gets a raise 
    App.husband.set('householdIncome', 90000); 
}, 3000);​ 

Manubrio (la vista):

<script type="text/x-handlebars" > 
    Wifes income: {{App.wife.householdIncome}}<br/> 
    Husbands income: {{App.husband.householdIncome}} 
</script>​ 
+0

Con la vista, si può anche utilizzare l'Ember.run.sync(), ma solo una chiamata è quindi necessario. http://jsfiddle.net/akLVy/10/ –

+0

Ben fatto, Clemens - molto utile! Penso che sia necessario spiegarlo molto meglio nei documenti. Non è una buona introduzione per i principianti quando uno degli esempi non viene eseguito "così com'è". –

+0

Grazie! Dan, sono completamente d'accordo. Questo deve essere aggiornato nei documenti! – pangratz

3

Avrai bisogno di chiamare Ember.run.sync(); dopo aver impostato i tuoi binding per dare al ciclo di Ember la possibilita 'di sincronizzare prima delle tue dichiarazioni di log. Questa è una pratica tecnica per testare anche con Ember, ma in genere non è necessaria nelle app Ember.

Problemi correlati