查看 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
适当更新。这是建议包装我的代码时文档正在谈论的情况之一Ember.run()
吗?