从理论上讲,您可以使用它reopenClass来重新打开Ember.Controller并扩展它以执行您需要的操作。我只是在 jsfiddle 中尝试过,但无法让它工作。
我所做的工作是Ember.Mixin。
App.IsOn = Ember.Mixin.create({
needs: ['application'],
isOn: Ember.computed.alias("controllers.application.isOn")
})
App.IndexController = Ember.Controller.extend(App.IsOn,{});
它不处理自动生成的控制器,但是如果您不需要控制器用于其他任何事情,它确实可以让您只用一行将功能放入控制器中。
这是一个一切正常的jsfiddle:
http://jsfiddle.net/DqeLv/
编辑:我还应该补充一点,您希望toggleOn在您的ApplicationRoute而不是ApplicationController. 事件的冒泡从最具体的控制器开始,然后到该控制器的路由,然后到每个连续的父路由(但不是控制器)。
因此,假设您正在"/users/new"触发一个动作,它将转到:
UsersNewController=> UsersNewRoute=> UsersRoute=>ApplicationRoute
编辑#2:好的,在睡了一会儿后,我可以开始reopen工作,以便自动生成的控制器自动获取isOn属性。
Ember.Controller.reopen({
needs: ['application'],
isOn: Ember.computed.alias("controllers.application.isOn")
});
似乎这仅适用于“通用”控制器,不适用于ArrayControlleror的实例ObjectController(仅适用于不返回 a 的路由model)。
如果您希望它适用于自动生成ArrayController和ObjectController实例,您可以使用reopen这两个类。
Ember.ArrayController.reopen({ ... })
http://jsfiddle.net/HTPaF/2/