使用RESOLVE进行路由不会等待完成结果以使用第二个reolve函数启动

时间:2015-06-10 09:12:05

标签: javascript angularjs angular-ui-router

AngularJS还是新手,我有以下情况......我正在寻找解决方案......

加载APP时(在显示任何屏幕之前) - 我需要加载以下内容(按照列表中所示的固定顺序):

  • .properties文件并将属性存储到ARRAY
  • 用于获取应用程序中使用的所有翻译标签的REST服务方法

因为属性文件将包含例如连接属性,所以加载此属性文件非常重要。在继续使用应用程序之前解析...

使用$routeProvider我使用了以下来处理“解决”方法:

// routing
app.config(function($routeProvider) {
  $routeProvider

    // login
    .when('/', {
        templateUrl : 'pages/login.html',
        controller  : 'loginController',
        resolve:{
            // load properties
            loadProperties: function(properties){
                return properties.initProperties();
            },
            // load labels
            loadLocalization: function(localize, properties){
                console.log(properties.getProperties());
                return localize.initLocalizedResources();
            }
        }
    })

    // dashboard
    .when('/dashboard', {
        templateUrl : 'pages/login.html'
    })        
});

'initLocalizedResources'方法:

initLocalizedResources: function(){
        if (!localize.loadedFromRest){
            localize.loading = true;

            //$localStorage.restServer = "http://localhost:8084";
            // var restServer = properties.getProperty('restServer') + '/WebSDPServiceMobileAPI/i18n/i18nlabels_get/culture/';

            var restServer = 'http://localhost:3034';
            var restServer = restServer + '/WebSDPServiceMobileAPI/i18n/i18nlabels_get/culture/';

            var culture = 'en-gb';
            if ($localStorage.language !== undefined)
                culture = $localStorage.language.culture;
            var restCall = restServer + culture;

            logMessage(' - Localize - callRestServer called -  : ' + restCall);
            return $http.get(restCall)
                .success(localize.successCallback)
                .error(function(data, status){
                    // set the flag to keep from looping in init
                    localize.loadedFromRest = false; 
                    localize.loading = false;
                }); 

        }
    },

'属性'服务:

app.factory('properties', function($http){  
var arrProperties = [];    
return { 
    getProperties: function(){
        return arrProperties;
    },
    getProperty: function(key){
        return arrProperties[key];
    },
    addProperty: function(key, value){
        console.log('add property : ' + key + ' - ' + value);
        arrProperties[key] = value;
    },
    initProperties: function(){  
        return $http.get('serviceapp.properties').then(function (response) {
            var props = response.data.split("\n");
            for (var i = 0, len = props.length; i < len; i++) {
                var value = props[i].split("=");
                arrProperties[value[0]] = value[1];
            }
            console.log(arrProperties);
        });            
    }
};
});    

但我注意到Resolve的顺序不是正确的顺序...... 在initLocalizedResources方法中记录属性时,它们仍然是[] ...在loginController内记录'属性'时,它们正确地填充了数据......但是在某个阶段太远......

我需要完成的是在本地化标签(REST)之前加载属性......

我的解决方法的想法:

  • 添加额外的route以加载属性,并在完成导航到第二个route时,它将加载本地化,然后继续/login route

  • 加载后,手动引导AngularJS应用程序&amp;解析属性

如上所述,这些感觉和解决方法,......

有没有人有任何其他想法/提示或任何帮助?

谢谢

1 个答案:

答案 0 :(得分:1)

我相信你可以这样做:

resolve:{
            // load properties
            loadProperties: function(properties){
                return properties.initProperties();
            },
            // load labels
            loadLocalization: function(localize, properties, loadProperties){
                console.log(properties.getProperties());
                return localize.initLocalizedResources();
            }
        }

注意,第二个解析如何依赖于loadProperties解析。

https://medium.com/opinionated-angularjs/advanced-routing-and-resolves-a2fcbf874a1c