2

私は $q angular ライブラリに頭を悩ませようとしています。私の routeprovider では、サーバーからすべてのデータを取得して localStorage に保存したいと考えています。しかし、何らかの理由で、selectMedia にルーティングする前に、すべての http リクエストが完了するのを待たないように解決されているようです。angularドキュメントを読んだ私の理解から、これは機能するはずですが、機能しません。私は概念を完全に誤解していますか、それとも私の考えは正しいですか?

         $routeProvider.           
            when('/', {
            redirectTo : '/selectMedia',
            resolve: {  
                data: function ($q, backendApi, localStorage, network, route, loginService){
                    var prices = function () {
                        var defer = $q.defer();
                        backendApi.prices.get(function (data) {
                            localStorage.setItem("videoPrice", data.VideoPrice);
                            localStorage.setItem("imagePrice", data.ImagePrice);
                            localStorage.setItem("prices", data.SliderPrices);
                            localStorage.setItem("priceSuffix", data.PriceSuffix);
                            defer.resolve();
                        }, defer.resolve);  
                        return defer.promise;
                    };
                    var validFormats = function () {
                        var defer = $q.defer(); 
                        backendApi.validFormats.get(function (formats) {
                            localStorage.setItem("validFormats", formats);
                            defer.resolve();
                        }, defer.resolve);
                        return defer.promise;
                    };
                    var videoFormats = function () {
                        var defer = $q.defer(); 
                        backendApi.videoFormats.get(function (videoFormats) {
                            localStorage.setItem("videoFormats", videoFormats); 
                            defer.resolve();
                        }, defer.resolve);
                        return defer.promise;
                    };
                    var categories = function () {
                        var defer = $q.defer();
                        backendApi.categories.get(function (data){
                            localStorage.setItem("categories", data.Categories);
                            defer.resolve();
                        },defer.resolve);   
                        return defer.promise;
                    };
                    var renewToken = function () {
                        var defer = $q.defer();
                        loginService.renewToken(defer.resolve);
                        return defer.promise;
                    };

                    if(network.isOnline()){                 
                        var promises = [renewToken(), categories(), videoFormats(), validFormats(), prices()];
                        return $q.all(promises);
                    }
                    else if(!network.isOnline() && localStorage.length === 0){
                        route('/error');
                    }
                }   
            }
        });
}]);
4

1 に答える 1

1

ルート定義で指定されているルートのコントローラーが表示されません。ngControllerビューレベルで設定したと思います。resolve定義にコントローラーが指定されていない場合、ブロックはスキップされます。

4/23更新

resolve公式ドキュメントから抽出されたプロパティの定義:

controller に注入する必要がある依存関係のオプションのマップ。これらの依存関係のいずれかが promise である場合、それらは解決され、コントローラーがインスタンス化されて $routeChangeSuccess イベントが発生する前に値に変換されます。

定義によると、resolveプロパティの設計目的は、ルートに関連付けられたコントローラーに依存関係を注入する方法を持つことです。

于 2013-04-22T16:29:42.217 に答える