私は複雑な angularjs アプリに取り組んでいます。複雑な意味での単一ビューは、コードのさまざまな場所 (ページ パーツ コントローラーやディレクティブ コントローラーなど) からクエリされる複数の異なるデータ ソースを持つことができます。これらのリクエストの一部は、解決に時間がかかる場合があり、ビューがやや無効な状態のままになることがあります。ある種の「データ読み込み」バナーを表示し、すべての約束が解決されるまでビューとのユーザー操作を無効にしたいと考えています。これは、$q.all() 関数を使用して単純な画面で機能します。ただし、アプリが構造化される方法は、データ ソース中心ではなく、よりビジネス ロジック中心です。したがって、より複雑な画面の場合、すべての約束が自然にアクセスできる単一の場所はありません。コード内にそのような場所を作成するのは面倒に思えます。
私はこの解決策を思いつきました:
angular.module('myApp').service('qConfigurer', function ($q) {
var pending = 0;
var origDefer = $q.defer;
$q.defer = function() {
pending++;
var result = origDefer.apply(arguments);
var origResolve = result.resolve;
var origReject = result.reject;
result.resolve = function() {
pending--;
return origResolve.apply(arguments);
};
result.reject = function() {
pending--;
return origReject.apply(arguments);
};
return result;
};
$q.pending = function() {
return pending;
};
return {};
});
同じことを達成するためのハッキーは少ないですか?