2

我有一个带有路由的后端:

resources :movies do
  collection do
    get :drafts
  end
end

store.find('movie') 将从 /movies 加载,但我想从 /movies/drafts 加载。

查找器有“后缀”选项,因此我意识到我需要编写自定义查找器。任何人都可以发布一个例子吗?

我试过这段代码:

App.Movie.reopenClass(  {
  findDrafts: function(store) {
    $.getJSON('/movies/drafts', function(payload) {
      store.pushPayload('movie', payload);
    });

    return store.all('movie');
  }
})

但是#pushPayload 从不返回模型数组,因此我使用 store.all,但它返回存储中的所有对象。我只需要通过自定义 ajax 请求检索模型。

还有 store.pushMany 返回一个模型数组,但它需要标准化的有效负载。在将json传递给pushMany之前标准化json的正确方法是什么?

我不能只替换适配器中的 buildURL,因为我也想使用默认 URL。

更新:

可能的解决方案:

App.Store = DS.Store.extend({
  revision: 11,

  findAllByUrl: function(type, url) {
    var self = this;
    var promise = Ember.Deferred.create();

    $.getJSON(url, function(payload) {
      var serializer = self.serializerFor(type);
      payload = serializer.extractArray(self, self.modelFor(type), payload);
      var objects = self.pushMany(type, payload);
      promise.resolve(objects);
    });

    return promise;
  }
});

var records = this.get('store').findAllByUrl('movie', '/movies/drafts');

对于这种简单的用例,它似乎很冗长。有什么想法、改进吗?我错过了什么吗?

4

1 回答 1

1

如果可能的话,您应该真正考虑迁移到 Ember Data 1.0 beta。事情发生了很大的变化。

在最新版本中,您可以pathForType覆盖Adapter.

https://github.com/emberjs/data/blob/master/TRANSITION.md#underscored-api-endpoints

TRANSITION文档对于进行更新非常有帮助。

于 2013-10-29T19:28:50.503 回答