在处理其他库中的事件时,为什么要使用Ember.run()?

时间:2013-10-07 04:51:55

标签: ember.js

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

  

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

通过查看此主题的来源和阅读帖子,我的理解是,当您致电Ember.run()时,会发生以下情况。

  1. 立即运行给定的回调。
  2. 执行运行循环算法,刷新所有队列,从而确保绑定同步等。
  3. 我试图理解为什么建议在调用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()

    时,这是文档所讨论的案例之一吗?

1 个答案:

答案 0 :(得分:0)

我认为运行Ember.run的想法是,任何异步事件(例如来自第三方库的事件侦听器)都可以与ember运行循环同步。

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