Ember setupController触发观察,我该如何防止这种情况发生

时间:2014-06-20 11:30:55

标签: ember.js

我的代码看起来像这样

App.ItemRoute = Em.Route.extend({
  setupController: function(controller) {
    var model = this.modelFor('item');
    controller.setProperties({
      name : model.get('name'),
      title: model.get('title')
    });
  }
});

App.ItemController = Em.ObjectController.extend({
  saveOnChange: function() {
    console.log('saveOnChange');
  }.observes('name', 'title'),
});

根据我的理解,因为我使用setProperties,观察应该只发射一次,但它会发射两次

还将setPropertiesbeginPropertyChanges&包裹起来endPropertyChanges仍然会发射两次


我最终还是因为它根本不发射,所以我最终做的是将控制器代码更改为这样

App.ItemController = Em.ObjectController.extend({
  load: false,
  saveOnChange: function() {
    if(!this.get('load')) {
      this.set('load', true);
      return;
    }
    console.log('saveOnChange');
  }.observes('name', 'title'),
});

如果更改只被触发一次,那么这段代码就可以工作了,但如果多次触发它就不会起作用(这是我的情况)

1 个答案:

答案 0 :(得分:1)

setProperties函数并没有合并你的观察者(不幸的是,没有办法做到这一点),它只是将它们分组为一个操作。来源可能会帮助您更好地了解它的作用:

Ember.setProperties = function(self, hash) {
  changeProperties(function() {
    for(var prop in hash) {
      if (hash.hasOwnProperty(prop)) { set(self, prop, hash[prop]); }
    }
  });
  return self;
};

所以,回到你的问题。我能想到的最好方法是去除你的功能。

App.ItemController = Em.ObjecController.extend({

    load: false,

    saveOnChange: function() {
        Em.run(this, 'debouncedSave', 150);
    }.observes('name', 'title'),

    debouncedSave: function() {
        if(!this.get('load')) {
            this.set('load', true);
        }
    }

 });

如果您不熟悉去抖动,可以阅读here。可能还有一些其他解决方案涉及直接操纵属性,但我不确定这是否是您想要停下来的道路。