2014-02-23 32 views
5

關於ember-data和subclassing DS.RESTAdapter以覆蓋buildURL重寫buildURL方法以包含父模型的ID

我有兩個端點。假設它們是:

example.com/users/user-id 
example.com/users/user-id/images 

將「user-id」替換爲實際的用戶ID。

所以,我有兩個型號:

App.User = DS.Model.extend 
    images: DS.hasMany 'image', 
     async: true 
     inverse: 'user' 

App.Image = DS.Model.extend 
    user: DS.belongsTo 'user', 
     async: true 
     inverse: 'images' 

然而,從/users/user-id端點有效載荷不返回到圖像的ID。我無法控制這個(這是第三方API)。

因此我需要向/ users/user-id/images發出一個單獨的請求。我繼承DS.RESTAdapter以指定的網址:

App.ImageAdapter = DS.RESTAdapter.extend 
    buildURL: (type, id) -> 
     # need to return "https://stackoverflow.com/users/user-id/images" 
     # but need to get the value of user-id somehow 

從條路,我怎麼會連去的用戶ID傳遞給存儲,以便它可以調用buildURL方法在自定義適配器與用戶ID?

App.UserRoute = Em.Route.extend 
    afterModel: (model) -> 
     # how to provide value of `model.get 'id'` to store/adapter/buildURL? 
     # do I even do that here? 
     promise = @get('store').find 'image' 
     @controllerFor('images').set 'model', promise 

我想我可以提供一個哈希find並跳過buildURL乾脆。但findQuery是一種私人方法。有沒有更喜歡的方式來做到這一點?

App.UserRoute = Em.Route.extend 
    afterModel: (model) -> 
     promise = @get('store').find 'image', userId: model.get 'id' 
     @controllerFor('images').set 'model', promise 

App.ImageAdapter = DS.RESTAdapter.extend 
    findQuery: (store, type, query) -> 
     imagesURL = "#{@host}/users/#{query.userId}/images" 
     delete query.userId 
     @ajax(imageURL, 'GET', { data: query }); 
+0

你有完整的例子嗎?這種情況沒有很好的記錄,我真的可以使用一個例子。謝謝 – Boaz

回答

4

肯定是有什麼不妥覆蓋findQuery,這是能夠延長適配器樂趣的一部分。我們必須做同樣的事情(我們的休息終點非常令人興奮)。

+0

是的,我想沒有其他辦法了。整個重寫私有方法很糟糕,因爲它破壞了封裝。然後再次是JavaScript。好吧。 – veidt

相關問題