访问在json服务器响应中传递的元信息

Mic*_*ein 23 ember.js ember-data

我正在使用Ember-Data Rest-Adapter,从我的服务器返回的JSON看起来基本上与Active Model Serializers文档中的JSON相似

{
  "meta": { "total": 10 },
  "posts": [
    { "title": "Post 1", "body": "Hello!" },
    { "title": "Post 2", "body": "Goodbye!" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

从服务器获取数据有效,但遗憾的是我无法确定从JSON响应中访问元信息的位置.

根据我对ember-data的github问题的研究,对meta信息的支持似乎是通过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"])
   }
})
Run Code Online (Sandbox Code Playgroud)

你们中的任何人都可以为我阐明一下吗,拜托?我知道Ember api正在快速移动,但我确信我只是错过了一小部分而且这实际上是可能的.

Mic*_*ein 7

我找到了一种更清晰的方法,用于使用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'
 });
Run Code Online (Sandbox Code Playgroud)

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

例如,响应如下:

  {
    'meta': {'pagination': { 'page': 1, 'total': 10 } },
    'posts':[
      ...
    ]
  }
Run Code Online (Sandbox Code Playgroud)

TypeMap为App.Post -型号将包括岗位已加载后的分页对象.

您无法直接观察商店的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')
 });
Run Code Online (Sandbox Code Playgroud)

我真的不认为这是元信息问题的一个很好的解决方案,但这是我能够用Ember-Data提出的最佳解决方案.也许这将在未来更容易.


Mic*_*ein 6

我找到了一种方法来访问响应中传递的元信息.但不幸的是,它似乎并没有得到开箱即用的ember-data的支持,我正在将元信息写入一个全局变量,然后我通过请求控制器中的绑定进行访问.

我最终自定义了RESTAdapter正在使用的序列化程序:

App.CustomRESTSerializer = DS.RESTSerializer.extend({
  extractMeta: function(loader, type, json) {
    var meta;
    meta = json[this.configOption(type, 'meta')];
    if (!meta) { return; }
    Ember.set('App.metaDataForLastRequest', meta);
    this._super(loader, type, json);
  }
});

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    bulkCommit: false,
    serializer: App.CustomRESTSerializer
  })
});
Run Code Online (Sandbox Code Playgroud)

我知道这不是特别漂亮,并且实际上认为这与ember-data期望我们做的事情相反,但是现在它正常工作.

我将尝试以更好的方式使用ember-data并在其工作时提交pull请求或在github上打开问题时其他人有兴趣使其工作.

如果有人找到更清洁的解决方案,请告诉我.