我正在尝试将ember-cli
和ember-cli-ic-ajax
用于Ember Data灯具。我已将ic.ajax.defineFixture
导入icDefineFixture
。
icDefineFixture('/users', {
response: {
email: 'user@example.com'
},
textStatus: 'success',
jqXHR: {}
});
哪个不会抛出任何错误,所以我知道我正在成功导入该函数。然后我创建一个记录,这没关系:
this.store.createRecord('user', {});
但是当我尝试将其保存在控制器动作中时:
this.get('model').save().then(function() { ... });
我收到404错误,因为当我测试时,ember数据正在联系我的服务器,后者没有后端。
我很困惑Ember Data如何知道使用ic-ajax的ajax方法。这是我必须手动设置的吗?我没有设法找到任何文件。
谢谢!
答案 0 :(得分:1)
我不相信ember-data完全使用ic-ajax,而是jQuery.ajax。在我正在编写的应用程序中,我使用的是ic-ajax而不是$ .ajax,只是因为它返回了RSVP的承诺。现在,我正在提出没有余烬数据的请求。
以下是Ghost源代码中的示例,其中ic-ajax用于发出请求。
设置:https://github.com/TryGhost/Ghost/blob/master/core/client/utils/ajax.js
用法:https://github.com/TryGhost/Ghost/blob/master/core/client/controllers/setup.js#L23
关于灯具,来自ic-ajax Github自述文件:
使用defineFixture添加灯具告诉ic-ajax解决了与灯具匹配而不是发出请求的灯具的承诺。这允许您测试您的应用程序,而无需使用sinon等创建虚假服务器。
Example:
ic.ajax.defineFixture('api/v1/courses', {
response: [{name: 'basket weaving'}],
jqXHR: {},
textStatus: 'success'
});
ic.ajax.request('api/v1/courses').then(function(result) {
deepEqual(result, ic.ajax.lookupFixture('api/v1/courses').response);
});
现在,如果你想将ic-ajax与ember-data一起使用,你可以覆盖你正在使用的Adapter上的createRecord,deleteRecord方法。有关ember-data如何进行ajax调用的示例,请参阅此关于createRecord的Ember API文档:http://emberjs.com/api/data/classes/DS.Adapter.html#method_createRecord
答案 1 :(得分:1)
感谢@ToddSmithSalter的建议,这使我找到了一个解决方案,结果对我的案例非常有效。我能够简单地在我的测试套件中加载的文件中重新打开我的适配器并重写ajax方法:
ApplicationAdapter.reopen({
ajax: function(url, verb, hash) {
icRequest(url)
}
});
我已将ic.ajax.request
导入为icRequest
这似乎工作正常,但我没有看到为每种类型的请求PUT
,GET
,POST
,DELETE
单独注册灯具的方法,等
答案 2 :(得分:1)
感谢@ kevin-bullaughey评论我能够调整Ember CLI 0.2.0-beta.1的解决方案:
import DS from 'ember-data';
import ENV from '../config/environment';
import { request } from 'ic-ajax';
var ApplicationAdapter = DS.RESTAdapter.extend();
if (ENV.environment === "test") {
ApplicationAdapter.reopen({
ajax: function(url) {
return request(url);
}
});
}
export default ApplicationAdapter;
在test
环境中,适配器将使用定义的ic-ajax
灯具,并在development
或production
中保持不变。