【问题标题】:Override buildURL method to include parent model's id覆盖 buildURL 方法以包含父模型的 id
【发布时间】:2014-02-23 04:17:03
【问题描述】:

关于 ember-data 和子类化 DS.RESTAdapter 以覆盖 buildURL

我有两个端点。假设他们是:

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 以指定 url:

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

从路由中,我什至如何将用户 ID 传递给商店,以便它可以使用用户 ID 调用自定义适配器中的 buildURL 方法?

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

【问题讨论】:

  • 你有完整的例子吗?这种情况没有很好的记录,我真的可以举一个例子。谢谢

标签: ember.js ember-data adapter


【解决方案1】:

覆盖findQuery 绝对没有错,这是能够扩展适配器的乐趣的一部分。我们不得不做同样的事情(我们的休息端点真的很令人兴奋)。

【讨论】:

  • 是的,我想没有别的办法了。覆盖私有方法的整个过程很糟糕,因为它破坏了封装。然后又是javascript。哦,好吧。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多