【问题标题】:Ember.js nested routesEmber.js 嵌套路由
【发布时间】:2013-01-16 12:45:42
【问题描述】:

干杯!我有路线:

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>

座位是 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>

它会返回 undefind。 经过一番调试,我发现params中没有任何id并且params为空,这就是为什么我无法在TourSeatsRou​​te函数中获得正确的模型。

【问题讨论】:

  • 函数参数中不需要参数吗?就像你在第二个中一样。 model: function(params) {
  • 哦,是的,我确实喜欢那样,很明显,只是在这里粘贴了错误的编辑。无论如何,问题仍然存在。
  • 请检查答案中的更新。
  • 从嵌套路由的父资源访问模型:stackoverflow.com/a/14688346/1662820

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


【解决方案1】:

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

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

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

【讨论】:

  • 哦,谢谢,我已经做了这个解决方法setupController: function() { this.controllerFor('tour.seats').set('model', this.modelFor('tour')); },但你的答案是“ember-way”。
【解决方案2】:

我还是 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 中?

【讨论】:

  • 我需要把它包装起来,以便按照我需要的方式使用它的网点。问题是——如何从嵌套路由访问父级资源路由的模型?
  • 我的印象是,如果您要嵌套资源,则需要为每个嵌套资源提供一个 id...因此,使用您描述的结构,您将拥有一个如下所示的 url: tours/:tours_id/tour/:tour_id/seats。旅游和旅游资源是不同的实体吗?
  • 不,是同一个实体,ArrayController 和 ObjectController。
  • 我不太明白你想要达到什么目的。为什么要嵌套相同的资源类型?...我已经更新了答案以显示由我建议的资源映射生成的示例 url
  • 我需要从嵌套路由 TourSeatsRou​​te 访问位于父路由 TourRoute 中的游览模型。一切都很简单。我已经拥有与您更新的答案相同的网址 - 只需查看问题即可。我已经有了 Tours ArrayController 和 Tour ObjectController,但是座位是 Tour 模型的属性,而不是独立模型本身。
【解决方案3】:

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

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

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

{{model.seats}}

【讨论】:

  • 你有{{tour.seats}},而我的是model,这在EmberJS中是特殊的。当您将模型传递给控制器​​时,它将始终为 {{model.property}}: {{model.seats}}
  • 同说:{{controller.model.seats}}
  • {{log controller.model.seats}} 未定义!它有什么问题?
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2012-11-18
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多