查看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()
?
答案 0 :(得分:0)
我认为运行Ember.run
的想法是,任何异步事件(例如来自第三方库的事件侦听器)都可以与ember运行循环同步。
我学会了很多关于Ember.run以及为什么在我开始将QUnit集成到我的项目中时它很有用,因为当你开始测试你的应用程序时,自动的ember.run循环功能代码被取出,这完全取决于你。