在我的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)。那我该怎么办?
答案 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
}
};