我正在使用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能够提供的最佳解决方案。也许将来会更容易。