2013-08-02 75 views
13

假設您在Ember應用程序中有以下路線。如何鏈接到Ember.js中的嵌套資源?

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' }); 
      }) 
     }); 
     }); 
    }); 
    }); 
}); 

我將如何鏈接到使用linkTo幫手把手提供特定插曲?換句話說,如何灰燼找出網址的其他參數應該是什麼,也就是serie_idepisode_id?該文件聲明我應該將episode型號傳遞給episode路線,如下所示。

{{#linkTo "episode" episode}} 

這是鏈接到以下URL結構。

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

當我使用linkTo助手這樣,灰燼拋出一個錯誤告訴我,它不能undefinedgetid。我認爲它使用的episode模型找出了serie_idepisode_id是我的猜測是,該模型需要順應了灰燼找到這些id個具體約定(結構或藍圖)。

這是我覺得最困難的有關灰燼方面。即使在調試模式下使用Ember,它也不是非常透明。任何指針或引用非常感謝。

更新1:一些挖後,我發現該路由的serialize方法是實現這一關鍵要素。但是,如上圖所示,當我使用linkTo幫助程序時,由於某種原因,傳遞給路線的serialize方法的模型爲undefined(即使傳遞給幫助程序linkTo時不是這樣)。導致此發現的問題可以找到here

更新2:原來,該serieSeason路線的serialize方法接收了錯誤的模型,一個小插曲,而不是一個賽季,當生成的鏈接目前還不清楚,但是,爲什麼它是在不正確的。模型。在什麼地方serialize方法的model參數從何而來?

更新3:linkTo幫助程序工作正常,如果我從每個涉及的路線的serialize方法返回靜態數據,這意味着linkTo幫助程序不涉及該問題。

回答

24

事實證明,答案可能會在灰燼的正確記錄源......找到,因爲這是在網上搜索了好幾天後,一個做什麼。

答案很簡單。 linkTo幫手接受多個模型。對於目標URL的每個動態片段,都會傳遞相應的模型。每個傳遞的模型將成爲目標URL中相應路線的模型。在我上面描述的例子中,結果如下。

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

serie模型將被傳遞給serie途徑,season模式向season路線,和episode模式向episode路線。令許多開發者困惑的是,當您使用linkTo幫助程序時,路由的model掛鉤不會被觸發。如果您意識到開發人員通過傳遞一個或多個模型(或零)來提供(或可以提供)相應路線的模型,這並不令人感到意外。

由於深層嵌套資源沒有太多文檔,因此找出linkTo輔助程序如何在底層完成其工作並不是微不足道的。在Ember的源代碼中潛水肯定有助於趕上框架的速度。

+3

http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#toc_supplying-multiple-models 也許這是不存在的,你問這個問題的時候...... –

+0

只用了幾天XP – ahnbizcad

+0

@LucasPottersky現在也不是! – StevenNunez