この小さなコードは、フロントエンド バックエンドレス環境用に別の .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
誰かがこれを修正するのを手伝ってくれますか?
コード内の .json ファイルを取得するために $http を直接呼び出したくないことに注意してください。これを行う目的は、このコードをバックエンドレス開発用に個別に保持することです。
ありがとう。
更新 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 が variable に確実に読み込まれるようにすることですdata
。これらはすべて、他のオブジェクトがトリガーされて ajax イベントを呼び出す前に発生する必要があります。これは、フロントエンド バックエンドレス開発専用のハックです。運用時には、もちろんこの .js ファイルは削除されます。私はこれがあまり好きではありasync: false
ませ$.ajax()
ん$http