2

查看 Ember.js 文档,关于何时使用Ember.run()(我的重点)相当模糊。

通常你不需要自己调用这个方法。但是,如果您在与其他库或插件交互时实现原始事件处理程序,您可能应该将所有代码包装在此调用中。

通过查看有关该主题的源代码和阅读帖子,我的理解是,当您调用 时Ember.run(),会发生以下情况。

  1. 给定的回调立即运行。
  2. 执行运行循环算法,刷新所有队列,从而确保绑定同步等。

我试图理解为什么建议在调用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()吗?

4

1 回答 1

0

我相信运行的想法Ember.run是让任何异步事件,例如来自 3rd 方库的事件侦听器,都可以与 ember 运行循环同步。

当我开始将 QUnit 集成到我的项目中时,我学到了很多关于 Ember.run 的知识以及为什么它很有用,因为当你开始测试你的应用程序时,自动 ember.run 循环功能代码被取出,这完全取决于你。

于 2013-12-19T06:17:30.220 回答