我正在使用Ember-Data Rest-Adapter,从服务器返回的JSON基本上类似于Active Model Serializers Documentation中的JSON。

{
  "meta": { "total": 10 },
  "posts": [
    { "title": "Post 1", "body": "Hello!" },
    { "title": "Post 2", "body": "Goodbye!" }
  ]
}

从服务器获取数据是可行的,但是不幸的是,我无法弄清楚从JSON响应中可以访问元信息的位置。

根据我对ember-data的github问题的研究,对元信息的支持似乎是implemented和commit 1787bff

但是即使使用测试用例,我也无法弄清楚如何访问元信息。
App.PostController = Ember.ArrayController.extend({
   ....
   requestSearchData: function(searchParams){
      posts = App.Post.find(searchParams);
      this.set('content', posts);
      // don't know how to access meta["total"]
      // but I want to do something like this:
      // this.set('totalCount', meta["total"])
   }
})

你们中有人可以帮我一下吗?我知道Ember api的运行速度很快,但是我敢肯定我只缺少一小部分,这实际上是可能的。

最佳答案

我发现了一种更干净的方法,用于从使用ember-data的服务器响应中提取元信息。

我们必须告诉序列化程序期望哪个元信息(在本例中为分页):

 App.serializer = DS.RESTSerializer.create();

 App.serializer.configure({ pagination: 'pagination' });

 App.CustomAdapter = DS.RESTAdapter.extend({
   serializer: App.serializer
 });

 App.Store = DS.Store.extend({
   adapter: 'App.CustomAdapter'
 });

之后,每当服务器发送带有分页对象的元属性时,该对象将被添加到商店中所请求的Model-Class的TypeMaps属性中。

例如,以下响应:
  {
    'meta': {'pagination': { 'page': 1, 'total': 10 } },
    'posts':[
      ...
    ]
  }

帖子加载后,App.Post-Model的TypeMap将包括分页对象。

您无法直接观察商店的TypeMaps属性,因此我向PostsController添加了一个计算属性以访问请求分页元信息:
 App.PostsController = Ember.ArrayController.extend({
    pagination: function () {
      if (this.get('model.isLoaded')) {
        modelType = this.get('model.type');
        this.get('store').typeMapFor(modelType).metadata.pagination
      }
    }.property('model.isLoaded')
 });

我真的不认为这是解决元信息问题的好方法,但这是Ember-Data能够提供的最佳解决方案。也许将来会更容易。

08-19 09:00