在setupController中设置模型时如何不在控制器中触发观察者?

时间:2014-09-05 17:26:49

标签: ember.js

我在控制器中为模型的属性设置了一个观察者函数。 一旦我进入该控制器的路线,它就会激活。

我知道这是因为controller.set('model', model);中的setupController。我该如何防止这种情况?

我希望使用observer在属性更改时更改另一个属性。

但由于这种行为,我的逻辑会导致错误.....

路线

MuteAdmin.NewRoute = Ember.Route.extend({
  model: function() {
    return this.store.createRecord(this.get('articleModelClassName'));
  },

  setupController: function(controller, model) {
    controller.set('model', model);

    this.store.find(this.get('categoryModelClassName')).then(function(categories) {
      controller.set('categories', categories);

      if (model.get('category') == null) {
        model.set('category', categories.get('firstObject'));
      };
    }.bind(this));
  },

  deactivate: function() {
    if(this.controller.get('isDirty')) this.controller.get('model').deleteRecord();
  }
});

控制器

MuteAdmin.NewController = Ember.ObjectController.extend(MuteAdmin.Modelable, {
  publicChanged: function() {
    console.log('How can I prevent this from printing when entering its route?');
  }.observes('public'),

  actions: {
    submit: function() {
      var currentUser = this.get('currentUser');
      var article = this.get('model');

      article.set('author', currentUser); 

      article.save().then(function() {
        this.set("flashSuccess", "Successfully Created.");

        this.transitionToRoute('index');
      }.bind(this), function() {

      });
    }
  }
});

1 个答案:

答案 0 :(得分:0)

可能不是Ember方式,但是当我需要在设置中操作模型和控制器时,我使用了一个标志来指示控制器正在设置。

这样的事情:

MyRoute = ProtectedRoute.extend({
    setupController: function (controller, model) {
        controller['settingController'] = true;
        controller.setProperties({
            'prop1Name' : val1,
            'prop2Name': val2,
            'propNName': valN
        });
        controller['settingController'] = false;
        // Call _super for default behavior
        this._super(controller, model);
    }
});

MyController = Ember.ObjectController.extend({
    anAfterChangeObserver: function() {
        if(controller['settingController']){
            return;
        }
        doSomethings();
    }.observes('prop1Name')
});