Ember.js嵌套路线

时间:2013-02-01 08:33:03

标签: javascript model-view-controller web-applications ember.js

干杯!我有路线:

TravelClient.Router.map(function() {
  this.resource('tours', function() {
    this.resource('tour', { path: ':tour_id' }, function(){
      this.route('seats');
    });   
  });
});

一个模板:

  <script type="text/x-handlebars" data-template-name="tour/seats">
    {{...}}
  </script>

Seats是Tour对象的一个​​属性:

TravelClient.Tour.find(1).get('seats');
12

我延长了我的TourSeats路线:

TravelClient.TourSeatsRoute = Ember.Route.extend({
  model: function(params) {
    return TravelClient.Tour.find(params.tour_id).get('seats');
  }
});

问题:如何在模板中渲染游览席位?

更新

我的灯具看起来像那样:

TravelClient.Store = DS.Store.extend({
  revision: 11,
  adapter: 'DS.FixtureAdapter'
});

TravelClient.Tour = DS.Model.extend({
  title: DS.attr('string'),
  description: DS.attr('string'),
  seats: DS.attr('number')
});

TravelClient.Tour.FIXTURES = [{
  id: 1,
  title: "Brighton, England",
  description: "Lorem ipsum dolor ... .",
  seats: 12
},...

我改变了我的路线延伸到这个:

TravelClient.TourSeatsRoute = Ember.Route.extend({
  model: function(params) {
    return TravelClient.Tour.find(params.tour_id);
  }
});

在模板中:

  <script type="text/x-handlebars" data-template-name="tour/seats">
    {{tour.seats}}
  </script>

更新2:

  <script type="text/x-handlebars" data-template-name="tour/seats">
    {{controller.model.seats}}
  </script>

它给了unfind回来。 经过一些调试我发现,params中没有任何id,params是空的,这就是为什么我无法在TourSeatsRou​​te函数中获得正确的模型。

3 个答案:

答案 0 :(得分:18)

如果您使用的是ember-1.0-pre.4 +,则仅针对您所在的特定路线返回参数,而不是整个网址。有一些discussion about this here

我认为此时所需的方法是使用this.modelFor传递您在父路由中设置的父资源的名称。所以在你的情况下,它将是:

TravelClient.TourSeatsRoute = Ember.Route.extend({
  model: function() {
    return this.modelFor("tour");
  }
});

答案 1 :(得分:2)

您只需要从model方法返回模型:

TravelClient.TourSeatsRoute = Ember.Route.extend({
  model: function(params) {
    return TravelClient.Tour.find(params.tour_id);
  }
});

然后在您的模板中,您可以执行以下操作:controller是上下文:

{{model.seats}}

答案 2 :(得分:1)

我还是EmberJS的新手但是我会编写我的路由器和这样的路线。

我不确定您是否需要将 post 资源包装在 posts 资源中。请注意ToursSeatsRou​​te中的复数形式

TravelClient.Router.map(function() {
  this.resource('tours', function() {        
    this.route('/:tour_id/seats');        
  });
});

这会给你以下网址:

/ tours - 您可以将其映射到ArrayController

/ tours /:tour_id / seats - 您可以将其映射到ObjectController

TravelClient.ToursSeatsRoute = Ember.Route.extend({
  model: function(params) {
    console.log(params); 
    return TravelClient.Tour.find(params.tour_id);
  }
});

试一试?或者可能将您的代码放在JSFiddle中?