2

皆さん、問題があります。私はAngularJSを使用しており、Angularサービス定義内に遅延オブジェクトを設定しています。

angular.module('myServices', []).
  service('Brand', function($rootScope, $q){
    var service = {
        getNext: function() {
            var deferred = $q.defer();

            setTimeout(function() {
                deferred.resolve('foo');
            }, 2000);

            return deferred.promise;
        }
    };

    return service;
});

このサービスは私のコントローラーで使用されています:

angular.module({
    controllers: {
        brand: function($scope, Brand) {
            $scope.changeBrand = function() {
                $scope.brand = Brand.getNext();
            }
        }
    }
}, ['myServices]);

そして最後に、ビューはPromiseが解決されるのを待ってから、それを表示します。

<a ng-click="changeBrand()" id="changeBrand">Change</a>
<p ng-bind="brand"></p>

問題は、約束が解決されているにもかかわらず、ビューは約束が解決されるのを待って結果を表示することは問題ありませんが、すぐには実行されないことです。このコードを追加してリンクをクリックした場合にのみ表示されます。

// View:
<a ng-click="apply()">Apply</a> 

// Controller:
$scope.apply = function() {
    $scope.$apply();
};

約束が存在するダイジェストの部分は、ビュー/コントローラーのスコープが変更されたときに実行されるダイジェストとは別に存在しますか?遅延が解決されたときに、ビュー/コントローラーのスコープでダイジェストを自動的に実行するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

5

数日前、私は約束のある怠惰なコントローラーを実装しているときに同じ問題を抱えていました。routeProviderに関するドキュメントを見ると、promiseで$ timeoutサービスを使用するサンプルがあります(https://github.com/angular/angular.js/blob/master/src/ng/route.js#L186) 。$timeoutの実装は$rootScope。$apply()を使用してライフサイクルを呼び出し、バインディングを更新します(AFAIKはすべてのダーティチェック関数を呼び出します-これはAngularでのバインディングの動作方法です)。したがって、私の問題(およびあなたの問題も)の解決策は、resolve()の後に$rootScope。$apply()を追加することでした。

 setTimeout(function() {
            deferred.resolve('foo');
            $rootScope.$apply();
        }, 2000);
于 2012-11-21T19:19:17.577 に答える