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正在快速移动,但我确信我只是错过了一小部分而且这实际上是可能的.
我找到了一种更清晰的方法,用于使用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提出的最佳解决方案.也许这将在未来更容易.
我找到了一种方法来访问响应中传递的元信息.但不幸的是,它似乎并没有得到开箱即用的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上打开问题时其他人有兴趣使其工作.
如果有人找到更清洁的解决方案,请告诉我.