接受的做法是重置一堆控制器

时间:2014-02-17 11:51:51

标签: ember.js

在我的App中的几种情况下,我需要重置一堆控制器(在ajax回复中,......)。这发生在应用程序的不同点,因此我没有始终可用的路径/控制器/视图。我希望有一个易于使用的功能来重置所有内容,无需任何参数。

这就是我要替换的内容(非常旧版本的ember):

function resetApp() {
  Dashboard.router.totalCallsController.set("content", 0);
  Dashboard.router.totalMinutesController.set("content", 0);
  Dashboard.router.callDurationAvgController.set("content", 0);
};

现在我在做:

function resetApp() {
  var container = Dashboard.__container__;
  container.lookup('controller:totalCalls').set("content", 0);
  container.lookup('controller:totalMinutes').set("content", 0);
  container.lookup('controller:callDurationAvg').set("content", 0);
}

但根据this answer,容器不应该用于此。如果我只能访问应用程序对象,如何获得控制器?在它变得简单之前:在Dasboard.router中,我们可以直接访问所有控制器。现在只能通过容器,但这不建议,并且可能会改变(API是n flux)。那我该怎么办?

1 个答案:

答案 0 :(得分:0)

如果你想采用最Emberish方式,但希望该功能在Ember之外生活,我会建议观察者模式。在本质上,无论何时创建控制器,您都可以将其订阅到全局重置功能。有几种方法可以实现这一点,我可能会用mixin来做。

这是一个小例子:

App.ResettableMixin = Em.Mixin.create({
  init: function(){
    this._super(); 
    App.Resettable.join(this.get('resetMe'), this);
  }
});

App.IndexController = Em.ArrayController.extend(App.ResettableMixin,{
  resetMe: function(){
    console.log('reset index controller');
  }
});


App.FooController = Em.ObjectController.extend(App.ResettableMixin,{
  resetMe: function(){
    console.log('reset foo controller ' + this.get('model'));
  }
});

App.Resettable = {
  resetters: [],

  join: function(methodToCall, context){
    this.resetters.push({method: methodToCall, context:context});
  },

  reset: function(){
    var item;
    console.log('resetting ' + this.resetters.length + ' items');
    for(var i = 0, len = this.resetters.length; i<len;i++){
      item = this.resetters[i];
      item.method.apply(item.context); 
    }
  },

  remove: function(methodToFind){
   // iterate through find, and remove it from resetters
  }
};

http://emberjs.jsbin.com/hudugene/4/edit