car*_*ted 32 javascript ajax rest ember.js
我打算使用ember.js,但我的REST api与打包的REST适配器并不完全一致.我想"覆盖"查找并能够将自己的ajax放入其中.我不喜欢一个余烬findAll如何检索我的所有文件没有分页选项,所以与其他查询参数一起使用会很有用 - 这就是为什么我想编写自己的ajax.我一直无法找到关于如何做到这一点的任何文档.
Kin*_*n2k 62
这是Ember Data 1.0 beta 9的最新版本.
扩展其中一个Ember数据适配器.使其网站范围:
App.ApplicationAdapter = DS.RESTAdapter.extend(....
Run Code Online (Sandbox Code Playgroud)
使其具体模型:
App.FooAdapter = DS.RESTAdapter.extend(...
Run Code Online (Sandbox Code Playgroud)
然后,您将定义要覆盖的实现.您始终可以选择调用this._super
并恢复到基本实现.例如
App.NotesAdapter = DS.RESTAdapter.extend({
find: function(store, type, id) {
id = "foo" + id;
return this._super(store, type, id);
}
});
Run Code Online (Sandbox Code Playgroud)
或者您可以完全覆盖实现:
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 } });
},
.....
});
Run Code Online (Sandbox Code Playgroud)
要查看完整的API,您可以覆盖:http://emberjs.com/api/data/classes/DS.RESTAdapter.html
通常更重要的是滚动自己的序列化程序来按摩数据以适应您的休息端点.以下是转换文档https://github.com/emberjs/data/blob/master/TRANSITION.md中的一些有用信息.
简短版本是一旦Ajax请求完成,生成的有效负载将通过以下钩子发送:
App.PostSerializer = DS.RESTSerializer.extend({ extractSingle: function(store, type, payload, id) { // massage this._super(store, type, payload, id); }, extractArray: function(store, type, payload) { // massage this._super(store, type, payload); }, normalize: function(type, hash, property) { // massage this._super(type, hash, property); } });
App.FooAdapter = Ember.Object.extend({
find: function(id){
return $.getJSON('http://www.foolandia.com/foooo/' + id);
}
});
Run Code Online (Sandbox Code Playgroud)
然后从你的路线,或任何地方
App.FooRoute = Ember.Route.extend({
model: function(){
var adapter = App.FooAdapter.create();
return adapter.find(1);
}
});
Run Code Online (Sandbox Code Playgroud)
现在我亲自将接头注入路线只是为了让我的生活更轻松:
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");
}
});
Run Code Online (Sandbox Code Playgroud)
然后在路线上你可以更懒惰,并做:
App.FooRoute = Ember.Route.extend({
model: function(){
return this.fooAdapter.find(1);
}
});
Run Code Online (Sandbox Code Playgroud)
示例:http://emberjs.jsbin.com/OxIDiVU/676/edit
您可以在没有Ember数据的情况下阅读更多关于Ember的信息:Ember without Ember Data
我有同样的问题.我也想用我的后端(cakePHP)稍微不同的格式,并且无法弄清楚如何做到这一点.之前的答案很棒,但您可能不需要重新定义每个方法,只需通过覆盖RESTAdapter中的buildURL来更改URL的格式.
例如,我想使用cakePHP的扩展,并希望我的网址看起来像这样,应用程序范围:
经过多次拔毛和实现ember-data必不可少的我使用了以下代码:
App.ApplicationAdapter = DS.RESTAdapter.extend({
buildURL: function(type, id) {
var url = '/' + this.pluralize(type.typeKey);
if (id) {
url += '/' + id;
}
url += '.json';
return url;
}
});
Run Code Online (Sandbox Code Playgroud)
Ember的文档很好,但他们的大部分示例都使用FIXTURE数据.我希望他们有一个简单的例子,说明如何为不同情况编写不同类型的适配器.
归档时间: |
|
查看次数: |
20361 次 |
最近记录: |