如何将计算属性注入Ember中的每个控制器?

时间:2013-09-06 23:55:59

标签: ember.js

如果我在应用程序控制器中设置了一些动作和计算属性,并希望在另一个控制器中使用计算属性,我当前必须手动在每个其他控制器中设置此属性。

这就是我现在这样做的方式:

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个问题:

  • 如何将其注入到自动生成的每个控制器中?
  • 这是在Ember中实现全局操作/属性的最佳方式吗?

1 个答案:

答案 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,{});

它不处理自动生成的控制器,但如果您不需要控制器,它只允许您将功能放入控制器中。

这是一个有效的方法:

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")
});

似乎这仅适用于“通用”控制器,而不适用于ArrayControllerObjectController的实例(仅适用于未返回model的路由)。

如果您希望它适用于自动生成的ArrayControllerObjectController个实例,您可以reopen这两个类。

Ember.ArrayController.reopen({ ... })

http://jsfiddle.net/HTPaF/2/