14

假设您在 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_idand episode_id?文档指出我应该将episode模型传递给episode路由,如下所示。

{{#linkTo "episode" episode}}

这是链接到以下 URL 结构。

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

当我linkTo像这样使用助手时,Ember 会抛出一个错误,告诉我它不能getidon调用undefined。我假设它使用episode模型来确定serie_idandepisode_id是什么,我的猜测是模型需要符合特定的约定(结构或蓝图),以便 Ember 找到这些ids。

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

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

更新 2:事实证明,当链接生成时,serieSeason路线的方法接收到错误的模型,即一集而不是一季。serialize不过,目前尚不清楚为什么它收到了错误的模型。方法的model参数serialize从哪里来?

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

4

1 回答 1

24

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

答案很简单。助手接受多个模型linkTo对于目标 URL 的每个动态段,您传递一个相应的模型。每个通过的模型都会成为目标 URL 中对应路由的模型。在我上面描述的示例中,这会导致以下结果。

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

serie模型将传递给serie路线,模型season传递给路线season,模型传递episodeepisode路线。model让很多开发者感到困惑的是,当你使用linkTohelper时,不会触发路由的钩子。如果您意识到开发人员通过传递一个或多个模型(或零个模型)来提供(或可以提供)相应路线的模型,这并不奇怪。

因为没有太多关于深度嵌套资源的文档,所以找出linkTo帮助程序如何在幕后完成工作并非易事。深入了解 Ember 的源代码肯定有助于加快框架的速度。

于 2013-08-03T18:37:08.657 回答