關於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 });
你有完整的例子嗎?這種情況沒有很好的記錄,我真的可以使用一個例子。謝謝 – Boaz