Ember.js のドキュメントを見ると、いつ使用するかについてかなりあいまいですEmber.run()
(強調)。
通常、このメソッドを自分で呼び出す必要はありません。ただし、他のライブラリやプラグインとやり取りするときに生のイベント ハンドラーを実装している場合は、すべてのコードをこの呼び出し内にラップする必要があります。
ソースに目を通し、このトピックに関する投稿を読んだ結果、 を呼び出すEmber.run()
と次のことが発生することがわかりました。
- 指定されたコールバックがすぐに実行されます。
- 実行ループ アルゴリズムが実行され、すべてのキューがフラッシュされ、バインディングが確実に同期されます。
への呼び出し内で他のライブラリのイベントを処理することが推奨される理由を理解しようとしていますEmber.run()
。次の例では、jQuery UI スライダーを作成してslide
イベントを処理しています。
<script type="text/x-handlebars" data-template-name="index">
<div id="slider"></div>
<h2>{{value}}</h2>
<h3>{{valueProse}}</h3>
</script>
App = Ember.Application.create();
App.IndexController = Ember.Controller.extend({
actions: {
valueChange: function (newValue) {
this.set('value', newValue);
}
},
valueProse: function () {
var value = this.get('value');
if (Ember.isNone(value)) {
return '';
}
if (value <= 25) {
return 'pretty small';
}
if (value <= 50) {
return 'getting bigger';
}
if (value <= 75) {
return 'whoa watch out';
}
if (value < 100) {
return 'can\'t handle it!';
}
return 'ahhhgghuarghblarp!';
}.property('value')
});
App.IndexView = Ember.View.extend({
didInsertElement: function () {
var controller = this.get('controller')
this.$('#slider').slider({
min: 0,
max: 100,
slide: function (event, ui) {
// Ember.run(function () {
controller.send('valueChange', ui.value);
// });
}
});
}
});
ここに実用的なフィドルがあります:http://jsfiddle.net/ahaurw01/Kwze5/2/
slide
イベントが への呼び出し内で処理されるかどうかに関係なく、Ember.run()
予期される動作が発生します。これが提供する最適化または保証を理解したいと思います。いずれにせよ、それvalue
が設定され、valueProse
適切に更新されていることがわかります。これは、コードをラップすることを提案するときにドキュメントが話しているケースの 1 つEmber.run()
ですか?