31

グローバル Javascript オブジェクトで指定された構成パラメーターを選択できるようにする、Angular アプリで小さなサービスを作成しようとしています。ドキュメントの準備ができていない限り、グローバル構成オブジェクトにアクセスしようとはしません (スクリプト要素が HTML に挿入される順序を保証できないため)。

$applyただし、実際にコールバックに伝播するために解決のために呼び出しが必要な理由がわかりませんthen

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) {
    var def = $q.defer();
    $(document).ready(function() {
        def.resolve(MyConfig.val);
        $rootScope.$apply();
    });

    def.promise.then(function () {
        console.log('I am called only when $apply() is called. Why?');
    });

    return def.promise;
}]);
4

1 に答える 1

33

AngularJS では、resolve() の結果は、すぐにではなく、$digest サイクル内で非同期に伝播されます。これは、then() で登録されたコールバックが (後で) ダイジェスト サイクルが発生したときにのみ呼び出されることを意味します。

あなたのコードでは、Angular がダイジェスト サイクルに入る原因は何もないため、 then() コールバックは呼び出されません。$apply() の呼び出しは、ダイジェスト サイクルを実行する 1 つの方法です。別の方法: 何もしない ng-click でボタンを追加してからクリックすると、ダイジェスト サイクルが発生し、結果が表示されます。

<button ng-click="">Force digest by clicking me</button>

https://stackoverflow.com/a/14657974/215945も参照してください

于 2013-02-07T22:18:09.657 に答える