gpt4 book ai didi

javascript - 如何为 ember.js 创建自定义适配器?

转载 作者:IT王子 更新时间:2023-10-29 03:16:41 26 4
gpt4 key购买 nike

我打算使用 ember.js,但是我的 REST api 与打包的 REST 适配器不完全一致。我想“覆盖”查找并能够将我自己的 ajax 放入其中。我不喜欢 ember findAll 如何在没有分页选项的情况下检索我的所有文档,因此与其他查询参数一起使用会很有用——这就是我想编写自己的 ajax 的原因。我一直无法找到任何有关如何执行此操作的文档。

最佳答案

对于 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 请求完成,生成的有效负载将通过以下 Hook 发送:

  1. 如果原始请求是针对单个记录(如查找/保存),则有效负载将发送到 extractSingle;如果原始请求是针对记录数组(如 findAll/findQuery),则有效负载将发送到 extractArray
  2. 这些方法的默认行为是将有效负载的顶层拆分为多个较小的记录。
  3. 这些较小的记录中的每一个都被发送到归一化,它可以一次对一条记录进行归一化。
  4. 最后,可以对特定类型的记录进行特殊归一化处理。
    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);      }    });
  • use extractSingle and extractArray when the top-level of your payload is organized differently than Ember Data expects
  • use normalize to normalize sub-hashes if all sub-hashes in the payload can be normalized in the same way.
  • use normalizeHash to normalize specific sub-hashes.
  • make sure to call super if you override extractSingle, extractArray or normalize so the rest of the chain will get called.

Rolling your own

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);
}
});

现在我个人会将适配器注入(inject)路由,只是为了让我的生活更轻松:

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

关于javascript - 如何为 ember.js 创建自定义适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com