2013-02-15 156 views
2

我有這樣路由器在我的應用程序:嵌套資源路由已經觸發父資源路線

TravelApi.Router.map -> 
    @resource 'stars', -> 
    @resource 'star', { path: '/:star_id' } 

當我去http://localhost/#/stars 我在Web控制檯看到有一個請求

GET http:// localhost:3000/stars

而當我去http://localhost/#/stars/1 我在Web控制檯看到有兩個請求

GET HTTP://本地主機:3000 /顆

GET HTTP://本地主機:3000 /明星/ 1

問題:爲什麼在第二種情況下有兩個請求?


星級路線

TravelApi.StarRoute = Ember.Route.extend(
    model: (params) -> 
    TravelApi.Star.find(params.star_id) 
) 

TravelApi.StarsRoute = Ember.Route.extend(
    model: -> 
    TravelApi.Star.find() 
) 

而且我模板: application.js.hbs.hamlbars

= hb "linkTo 'stars'" do 
    stars 
%div= hb 'outlet' 

stars.js.hbs.hamlbars

%ul 
    =hb "each star in controller" do 
    %li< 
     =hb 'star.name' 

star.js.hbs.hamlbars

Star: 
= hb 'name' 

商店 .js.coffee

TravelApi.store = DS.Store.create(
    revision: 11 
    adapter: DS.RESTAdapter.create() 
) 
+1

它真的不應該有第二個要求,如果你已經在'Store'該記錄。你可以添加'Store'的定義嗎?你有一個自定義主鍵嗎?此外,在StarRoute中,嘗試將其更改爲App.store.find('App.Star',params.star_id)'。不知道它是否會有所不同,但試試 – MilkyWayJoe 2013-02-15 17:04:21

+0

現在你可以看到我的商店定義。此外,我將json中的主鍵從** _ id **更改爲** id **(因爲mongoid)。我還將outlet添加到stars.js.hdb.hamlbars。現在我只有在第一次資源加載時有兩個請求,但是如果我之前加載星星比每次加載特殊星形時都只有一個請求(通過ID)*** GET http:// localhost:3000/stars *** – freemanoid 2013-02-16 13:59:35

回答

1

的方式嵌套資源的工作,如果第一請求返回一個承諾(其餘燼數據是應該這樣做),直到ajax請求完成之後纔會調用嵌套的資源/路由模型函數。

遵循這個邏輯,應該只有1個Ajax調用。

TravelApi.Star.find()應創建一個ajax請求來獲取所有記錄 TravelApi.Star.find(1)不應該要求ajax請求,因爲記錄應該在那裏。

但在您的情況下,star資源不會等待stars資源完成ajax。原因是TravelApi.Star.find()立即返回結果(這是商店中當然是空的所有可用記錄),而不是承諾(我認爲)。

爲了解決這個問題,你可以寫在你的模型如下返回findQuery承諾: TravelApi.Star.find({})

這將導致star資源等待stars資源來完成其Ajax請求。

路線應該是這樣的:

TravelApi.StarsRoute = Ember.Route.extend 
    model: -> 
    TravelApi.Star.find({}) 

TravelApi.StarRoute = Ember.Route.extend 
    model: (params) -> 
    TravelApi.Star.find(params.star_id) 
+0

如果我從我的路線中刪除** params.star_id **,那麼我沒有任何** id **的請求。所以這是行不通的。 – freemanoid 2013-02-16 14:01:06

+0

這是星星路線,不是星路線。將params.star_id保留在星號路線中。 – 2013-02-16 14:23:44

+0

好吧,我試過了,但它沒有任何效果。正如我在上面評論中所描述的那樣。 – freemanoid 2013-02-16 14:34:32

1

看來你不想去取時加載/明星/全明星:ID

爲什麼所有的明星都的原因如果直接訪問/ star/1是因爲star路由嵌套在內部stars

您之所以會嵌套您的路由,是因爲您的UI是嵌套的。這意味着,當你在看一個明星時,你的用戶界面的某個地方(可能是側欄),你正在顯示星星列表。在這種情況下,您需要請求localhost:3000/stars,因爲即使您正在查看一顆星星,也需要顯示所有星星。這意味着所請求的ajax是必需的,因此不是問題。

但是,如果你不是在看一個明星時顯示所有明星的名單,那麼你的路由不應該被嵌套在首位。在這種情況下,解決您的路線是這樣的:

TravelApi.Router.map -> 
    @resource 'stars' 
    @resource 'star', { path: '/:star_id' } 
+0

好吧,我猜這個。但是,如果我已經加載了所有星星,爲什麼這個(通過id)查詢加載一切而不是從內存中讀取? – freemanoid 2013-02-19 17:09:19