Ember.js在控制器之间传递属性

时间:2013-02-19 09:59:17

标签: javascript ember.js

干杯!我有两个控制器,我希望能够从takenSeatsNumbers访问TravelClient.TourController

TravelClient.TourController = Ember.ObjectController.extend({
  needs: ['tour.seats']
});

TravelClient.TourSeatsController = Ember.ObjectController.extend({
  takenSeatsNumbers: []
});

我是否以正确的方式使用needs?如何从takenSeatsNumbers模板获取tour

2 个答案:

答案 0 :(得分:1)

如上所述,这是一个current bug,所以上面的看似工作,但实际上并没有像jsFiddle所说的那样在现实中工作。目前的解决方案是通过路由中的this.controllerFor传递控制器的实例。它远非理想,但现在就足够了。

这是因为Ember是指使用 dot.notation 的控制器,而如果使用 camelCase 或* under_scores *则会创建不同的实例。

解决方案是从您的路线注入控制器,如下所示:

TravelClient.IndexRoute = Ember.Route.extend({
    setupController: function(controller) {
        var tourSeatsController = this.controllerFor('tour.seats');
        tourSeatsController.set('takenSeatsNumbers', [1,2,3]);
        controller.set('tourSeatsController', tourSeatsController);
    }
});

然后您可以在视图中使用它:{{tourSeatsController.takenSeatsNumbers.length}}

答案 1 :(得分:0)

此代码基于ember-pre4。来自另一个控制器的属性的代理似乎是这种方式的模式,并且可能在mixin的帮助下被推广:

TravelClient.TourController = Ember.ObjectController.extend({
  needs: ['tourSeats'],
  someMethod : function(){
    var tourSeatsController = this.get("controllers.tourSeats");
    // do something with it
  },
  takenSeatsNumbers : function(){ //proxy the property
    return this.get("controllers.tourSeats.takenSeatsNumbers")
  }.property("controllers.tourSeats.takenSeatsNumbers")
});

TravelClient.TourSeatsController = Ember.ObjectController.extend({
  takenSeatsNumbers: []
});