我在单独的 .js 文件中为前端后端环境编写了这个小代码。myfile.json
每当有 ajax 调用时,我都需要获取/somelink
。
angular.module('myApp')
.config(function($provide) {
$provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
})
.run(function($httpBackend, $http) {
$httpBackend.whenGET('/somelink').respond(function(method, url, data) {
$http({method: 'GET', url: '/somelink/myfile.json'})
.success(function(data, status, headers, config) {
return data;
})
.error(function(data, status, headers, config) {
});
});
});
但是这段代码不起作用并给了我错误:
Error: Unexpected request: GET /somelink/myfile.json
有人可以帮我解决这个问题吗?
请注意,我不想直接调用 $http 在我的代码中获取 .json 文件,因为这会破坏生产代码。这样做的目的是单独保留此代码以进行后端开发。
谢谢。
更新 1:
我补充说:
$rootScope.$apply();
$httpBackend.flush();
现在,除了以前的相同错误之外,我还有另一个错误:Uncaught Error: No pending request to flush !
更新 2:
玩了一圈之后,我发现了一个小技巧。我把它放在.run()
所有其他 $httpBackend 模拟之前。此外,此.js
文件必须放在所有控制器/服务/指令之前和 app.js 引导程序之后。
var data;
$.ajax({
type: 'GET',
async: false,
url: '/somelink/myfile.json'
}).success(function(res) {
data = res;
}).error(function(data) {
});
然后这个:
$httpBackend.whenGET('/somelink').respond(data);
关键是async: false
这样可以确保将 JSON 加载到 variabledata
中。所有这些都必须在其他对象触发并调用 ajax 事件之前发生。这仅适用于前端后端开发。生产时,当然会删除这个 .js 文件。我不太喜欢这个是因为使用async: false
和直接$.ajax()
而不是$http