如何链接到Ember.js中的嵌套资源?

时间:2013-08-02 13:46:42

标签: ember.js handlebars.js

假设您在Ember应用程序中有以下路径。

App.Router.map(function() {
  this.resource('series', function() {
    this.resource('serie', { path: '/:serie_id' }, function() {
      this.resource('seasons', function() {
        this.resource('season', { path: '/:season_id' }, function() {
          this.resource('episodes', function() {
            this.resource('episode', { path: '/:episode_id' });
          })
        });
      });
    });
  });
});

如何使用Handlebars提供的linkTo帮助程序链接到特定的剧集?换句话说,Ember如何确定URL的其他参数应该是什么,即serie_idepisode_id?文档说明我应该将episode模型传递到episode路由,如下所示。

{{#linkTo "episode" episode}}

这是为了链接到以下网址结构。

/series/:serie_id/seasons/:season_id/episodes/:episode_id/

当我使用linkTo这样的帮助时,Ember会发出错误,告诉我它无法在get上使用id来呼叫undefined。我假设它使用episode模型来确定serie_idepisode_id是什么,我的猜测是模型需要符合Ember的特定约定(结构或蓝图)找到这些id s。

这些是我觉得Ember最难的方面。即使在调试模式下使用Ember,它也不是很透明。非常感谢任何指针或参考。

更新1:经过一番挖掘,我发现路线的serialize方法是实现这一目标的关键因素。但是,当我使用上面所示的linkTo助手时,由于某种原因,传递给路径的serialize方法的模型为undefined(即使传递给{{1帮助。可以找到导致此发现的问题here

更新2:事实证明,当生成链接时,linkTo路由的serieSeason方法会收到错误的模型,而不是季节。但是,目前尚不清楚它为什么会收到错误的模型。 serialize方法的model参数来自哪里?

更新3:如果我从所涉及的每个路由的serialize方法返回静态数据,linkTo帮助程序工作正常,这意味着不涉及serialize帮助程序在问题中。

1 个答案:

答案 0 :(得分:24)

事实证明,答案可以在正确记录的Ember来源中找到...因为这是在网上搜索了几天之后所做的事情。

答案很简单。 linkTo帮助程序接受多个模型。对于目标网址的每个动态细分,您都会传递相应的模型。每个传递的模型将成为目标URL中相应路径的模型。在上面描述的示例中,结果如下:

{{#linkTo "episode" serie season episode}}

serie模型将传递到serie路线,season模型传递到season路线,episode模型传递到episode路线1}}路线。令许多开发人员感到困惑的是,当您使用model帮助程序时,不会触发路由的linkTo挂钩。如果您意识到开发人员通过传递一个或多个模型(或零)为相应路径提供(或可以提供)模型,那就不足为奇了。

由于没有太多关于深层嵌套资源的文档,因此了解linkTo帮助程序如何完成其​​工作并非易事。在Ember的源头潜水肯定有助于加快框架的速度。