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

Ember.js pass properties between controllers

本文关键字:属性 之间 控制器 js Ember      更新时间:2023-09-26

干杯!我有两个控制器,我想从TravelClient.TourController访问takenSeatsNumbers

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

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

如上所述,这是一个当前的错误,因此上面的看起来是,但实际上不会起作用,正如jsFiddle所展示的那样。目前的解决方案是在控制器的实例中通过路由中的this.controllerFor。这还远远不够理想,但目前已经足够了。

发生这种情况是因为Ember指的是使用点符号的控制器,而如果您使用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}}

此代码基于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: []
});