从理论上讲,您可以使用它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")
});
似乎这仅适用于“通用”控制器,不适用于ArrayController
or的实例ObjectController
(仅适用于不返回 a 的路由model
)。
如果您希望它适用于自动生成ArrayController
和ObjectController
实例,您可以使用reopen
这两个类。
Ember.ArrayController.reopen({ ... })
http://jsfiddle.net/HTPaF/2/