对于 Ember 数据
这是 Ember Data 1.0 beta 9 的最新版本。
扩展 Ember 数据适配器之一。使其在站点范围内:
App.ApplicationAdapter = DS.RESTAdapter.extend(....
使其特定于模型:
App.FooAdapter = DS.RESTAdapter.extend(...
然后您将定义您想要覆盖的实现。您始终可以选择调用 this._super 并恢复到基本实现。例如
App.NotesAdapter = DS.RESTAdapter.extend({
find: function(store, type, id) {
id = "foo" + id;
return this._super(store, type, id);
}
});
或者您可以完全覆盖实现:
App.NotesAdapter = DS.RESTAdapter.extend({
find: function(store, type, id) {
// Do your thing here
return this.ajax(this.buildURL(type.typeKey, id), 'GET');
},
findAll: function(store, type, sinceToken) {
// Do your thing here
var query;
if (sinceToken) {
query = { since: sinceToken };
}
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},
findQuery: function(store, type, query) {
// Do your thing here
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},
findMany: function(store, type, ids, owner) {
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: { ids: ids } });
},
.....
});
要查看完整的 api,您可以覆盖:http://emberjs.com/api/data/classes/DS.RESTAdapter.html
序列化器
通常更重要的是滚动您自己的序列化程序来处理数据以适应您的休息端点。以下是过渡文档https://github.com/emberjs/data/blob/master/TRANSITION.md 中的一些有用信息。
简短的版本是,一旦 Ajax 请求完成,生成的有效负载将通过以下钩子发送:
- 如果原始请求是针对单个记录(例如 find/save),则有效负载将发送到 extractSingle;如果原始请求针对记录数组(例如 findAll/findQuery),则将负载发送到 extractArray
- 这些方法的默认行为是将负载的顶层拆分为多个较小的记录。
- 这些较小的记录中的每一个都被发送到规范化,这可以一次对一条记录进行规范化。
- 最后,可以对特定类型的记录进行特殊规范化。
App.PostSerializer = DS.RESTSerializer.extend({
extractSingle:函数(存储,类型,有效负载,ID){
// 按摩
this._super(store, type, payload, id);
},
extractArray:函数(存储,类型,有效负载){
// 按摩
this._super(store, type, payload);
},
规范化:函数(类型,哈希,属性){
// 按摩
this._super(类型,哈希,属性);
}
});
- 当您的有效负载的顶级组织方式与 Ember Data 预期的不同时,请使用 extractSingle 和 extractArray
- 如果有效载荷中的所有子哈希都可以以相同的方式进行归一化,则使用 normalize 对子哈希进行归一化。
- 使用 normalizeHash 规范化特定子哈希。
- 确保在覆盖 extractSingle、extractArray 或 normalize 时调用 super,以便调用链的其余部分。
自己动手
App.FooAdapter = Ember.Object.extend({
find: function(id){
return $.getJSON('http://www.foolandia.com/foooo/' + id);
}
});
然后从你的路线,或任何地方
App.FooRoute = Ember.Route.extend({
model: function(){
var adapter = App.FooAdapter.create();
return adapter.find(1);
}
});
现在我个人会将适配器注入到路由中,只是为了让我的生活更轻松:
App.initializer({
name: "fooAdapter",
initialize: function (container, application) {
application.register("my:manager", application.FooAdapter);
application.inject("controller", "fooAdapter", "my:manager");
application.inject("route", "fooAdapter", "my:manager");
}
});
然后在路线上你可以更懒一点:
App.FooRoute = Ember.Route.extend({
model: function(){
return this.fooAdapter.find(1);
}
});
例如:http://emberjs.jsbin.com/OxIDiVU/676/edit
您可以在没有 Ember 数据的情况下阅读有关 Ember 的更多信息:Ember without Ember Data