如果我在应用程序控制器中设置了一些动作和计算属性,并希望在另一个控制器中使用计算属性,我当前必须手动在每个其他控制器中设置此属性。
这就是我现在这样做的方式:
App.ApplicationController = Ember.Controller.extend
isOn: true
actions:
on: ->
this.set('isOn', true);
off: ->
this.set('isOn', false);
App.IndexController = Ember.Controller.extend
needs: ['application']
isOn: Ember.computed.alias("controllers.application.isOn")
2个问题:
答案 0 :(得分:1)
理论上,您可以使用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,{});
它不处理自动生成的控制器,但如果您不需要控制器,它只允许您将功能放入控制器中。
这是一个有效的方法:
编辑:我还应该补充一点,您希望在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
或ObjectController
的实例(仅适用于未返回model
的路由)。
如果您希望它适用于自动生成的ArrayController
和ObjectController
个实例,您可以reopen
这两个类。
Ember.ArrayController.reopen({ ... })