假设您在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_id
和episode_id
?文档说明我应该将episode
模型传递到episode
路由,如下所示。
{{#linkTo "episode" episode}}
这是为了链接到以下网址结构。
/series/:serie_id/seasons/:season_id/episodes/:episode_id/
当我使用linkTo
这样的帮助时,Ember会发出错误,告诉我它无法在get
上使用id
来呼叫undefined
。我假设它使用episode
模型来确定serie_id
和episode_id
是什么,我的猜测是模型需要符合Ember的特定约定(结构或蓝图)找到这些id
s。
这些是我觉得Ember最难的方面。即使在调试模式下使用Ember,它也不是很透明。非常感谢任何指针或参考。
更新1:经过一番挖掘,我发现路线的serialize
方法是实现这一目标的关键因素。但是,当我使用上面所示的linkTo
助手时,由于某种原因,传递给路径的serialize
方法的模型为undefined
(即使传递给{{1帮助。可以找到导致此发现的问题here。
更新2:事实证明,当生成链接时,linkTo
路由的serieSeason
方法会收到错误的模型,而不是季节。但是,目前尚不清楚它为什么会收到错误的模型。 serialize
方法的model
参数来自哪里?
更新3:如果我从所涉及的每个路由的serialize
方法返回静态数据,linkTo
帮助程序工作正常,这意味着不涉及serialize
帮助程序在问题中。
答案 0 :(得分:24)
事实证明,答案可以在正确记录的Ember来源中找到...因为这是在网上搜索了几天之后所做的事情。
答案很简单。 linkTo
帮助程序接受多个模型。对于目标网址的每个动态细分,您都会传递相应的模型。每个传递的模型将成为目标URL中相应路径的模型。在上面描述的示例中,结果如下:
{{#linkTo "episode" serie season episode}}
serie
模型将传递到serie
路线,season
模型传递到season
路线,episode
模型传递到episode
路线1}}路线。令许多开发人员感到困惑的是,当您使用model
帮助程序时,不会触发路由的linkTo
挂钩。如果您意识到开发人员通过传递一个或多个模型(或零)为相应路径提供(或可以提供)模型,那就不足为奇了。
由于没有太多关于深层嵌套资源的文档,因此了解linkTo
帮助程序如何完成其工作并非易事。在Ember的源头潜水肯定有助于加快框架的速度。