OP から要求されたので、これは現在取り組んでいるアプリに使用している方法に基づいています。このメソッドはの動作を変更するのではなく、ある種の視覚的な表示が必要な promise を処理するための非常に単純な$q
API を追加します。これは、使用されるすべての場所で修正が必要ですが、ワンライナーに過ぎません。
使用法
ajaxIndicator
たとえば、UI の一部を更新する方法を知っているサービスがあります。promise のようなオブジェクトが、promise が解決されるまで指示を提供する必要がある場合は常に、次を使用します。
// $http example:
var promise = $http.get(...);
ajaxIndicator.indicate(promise); // <--- this line needs to be added
promise への参照を保持したくない場合:
// $http example without keeping the reference:
ajaxIndicator.indicate($http.get(...));
またはリソースを使用:
var rc = $resource(...);
...
$scope.obj = rc.get(...);
ajaxIndicator.indicate($scope.obj);
$then()
(注: Angular 1.2 の場合、リソース オブジェクトにないため、微調整が必要になります。)
ルート テンプレートで、インジケーターを にバインドする必要があります$rootScope.ajaxActive
。
<div class="ajax-indicator" ng-show="ajaxActive"></div>
実装
(ソースから変更。) 警告: この実装では、ネストされた呼び出しが考慮されていません。(私たちの要件では UI のブロックが必要だったので、ネストされた呼び出しは想定していません。興味があれば、このコードを拡張してみることもできます。)
app.service("ajaxIndicator", ["$rootScope"], function($rootScope) {
"use strict";
$rootScope.ajaxActive = false;
function indicate(promise) {
if( !$rootScope.ajaxActive ) {
$rootScope.ajaxActive = true;
$rootScope.$broadcast("ajax.active"); // OPTIONAL
if( typeof(promise) === "object" && promise !== null ) {
if( typeof(promise.always) === "function" ) promise.always(finished);
else if( typeof(promise.then) === "function" ) promise.then(finished,finished);
else if( typeof(promise.$then) === "function" ) promise.$then(finished,finished);
}
}
}
function finished() {
$rootScope.ajaxActive = false;
}
return {
indicate: indicate,
finished: finished
};
});