1

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

这就是我现在的做法:

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 中实现全局操作/属性的最佳方式吗?
4

1 回答 1

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

它不处理自动生成的控制器,但是如果您不需要控制器用于其他任何事情,它确实可以让您只用一行将功能放入控制器中。

这是一个一切正常的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)。

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

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

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

于 2013-09-07T05:43:26.930 回答