2012-04-02 6 views

答えて

11

Ember.jsは、バインディング、オブザーバーなどを許可するためにRunLoopの概念を使用しています。

例の問題点は、バインドされたプロパティを設定し、console.logで値をすぐに取得すると、イベントが発生せず、RunLoopがトリガされ、変更が同期されることです。 RunLoopに関する2つの優れたブログ記事:Part 1Part 2があります。彼らはSproutcoreをターゲットにしていますが、Ember.jsの概念はほぼ同じです。

例を作るには2通りの方法があります。 Ember.run.sync()を呼び出すドキュメント状態としてEmber.run.sync()

経由

強制同期は、...を同期するために、すぐにアプリケーション内のすべてのバインディングを強制するのに便利な方法です。これは、このようなコードを残し、

は、ビュー内の値ビューでプロパティを表示

を表示... 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​ 

または第二の選択肢にあるを参照してくださいあなたのためのすべての実行ループのものを扱い、http://jsfiddle.net/pangratz666/Ub97S/

のJavaを見ますスクリプト

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

ハンドル(ビュー):ビューで

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

、我々はまた、Ember.run.sync()を使用することができますが、コールは1つだけで、その後必要です。 http://jsfiddle.net/akLVy/10/ –

+0

よくできました、Clemens - 非常に便利です!私はこれをドキュメントでもっとうまく説明する必要があると思います。例の1つが「そのまま」実行されない場合、初心者のための良い紹介ではありません。 –

+0

ありがとう!ダン、私は完全に同意するでしょう。これはドキュメントで更新する必要があります! – pangratz

3

あなたはエンバーの実行ループをあなたのログステートメントの前に同期する機会を与えるためにあなたのバインディングを設定した後Ember.run.sync();を呼び出す必要があります。これはEmberでテストするための便利なテクニックですが、通常Emberアプリケーション自体では必要ありません。

関連する問題