2

我正试图围绕 $q 角度库。在我的 routeprovider 中,我想从服务器获取所有数据并将其存储在 localStorage 中。但由于某种原因,在路由到 selectMedia 之前,解析似乎没有等待所有 http 请求完成。根据我阅读角度文档的理解,这应该可以工作,但不能。我完全误解了这个概念还是我的想法正确?

         $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从官方文档中提取的属性定义:

一个可选的依赖关系映射,应该注入到控制器中。如果这些依赖项中的任何一个是承诺,它们将在控制器被实例化并触发 $routeChangeSuccess 事件之前被解析并转换为一个值。

根据定义,该resolve属性的设计目的是有一种方法可以将依赖项注入到与路由关联的控制器中。

于 2013-04-22T16:29:42.217 回答