如何在加载JSON文件后调用$ urlRouterProvider.otherwise()?

时间:2016-03-02 04:24:09

标签: angularjs ionic-framework

我正在开发一个基于离子和角度js的项目。我正在加载JSON文件,其中包含键值对中的一些JSON数据。我想要实现的是在完全加载json文件后我必须调用$ urlRouterProvider.otherwise()方法。以下是我尝试的代码,但它对我不起作用。我试过把控制台放在' defaultRoute'功能它正在执行但是' $ urlRouterProvider.otherwise(' / tab / myjobs')'这行不起作用。以下代码出现在app.config函数中。任何帮助将不胜感激。

$.getJSON('js/constants/'+lang+'.json')
        .then(function(response) {
       $translateProvider.translations(window.localStorage['deviceLanguage'],response);
       defaultRoute($urlRouterProvider);
              }, function(response) {
                  //$translate.use('en');
      });


function defaultRoute($urlRouterProvider){
             if(window.localStorage['userData']) {
        var access_token = JSON.parse(window.localStorage['userData']).access_token;
        if(access_token){
            $urlRouterProvider.otherwise('/tab/myjobs');
        }else{
            $urlRouterProvider.otherwise('/login');
        }
   }else{
       console.log("in line 282");
        $urlRouterProvider.otherwise('/login');
   }
 }

3 个答案:

答案 0 :(得分:1)

问题是您在配置阶段运行异步方法

AngularJS生命周期分为 2阶段配置(您可以使用提供商,但不能使用服务,因为这些尚未注册) ,并运行(你不能使用提供者,但你可以使用服务,一般来说等同于主要功能)。

运行阶段在配置阶段结束时开始,配置阶段不等待任何异步进程,所以发生的是当您的JSON获取承诺解决了您的配置阶段已经完成(所以你尝试在你的承诺成功回调中做的任何提供者配置都没有真正配置任何东西)。

简而言之,你不能使用$ urlRouterProvider.otherwise()传递异步调用的结果,就像你的getJson方法一样。

您尝试做的几种替代方法(根据身份验证重定向用户)是: angular ui-router login authenticationangularjs redirect to login page if not authenticated with exceptions

答案 1 :(得分:0)

考虑使用if(access_token){ $state.go('myJobs'); // where myJobs is the state correlated with your url 'tabs/jobs' }else{ $state.go('login'); // or whatever the state name is that you have for 'login' } }else{ console.log("in line 282"); $state.go('login'); }

您希望代码看起来像这样:

{{1}}

答案 2 :(得分:0)

如果您尝试有条件地将用户发送到不同的路由,请使用$state.go('route.path')而不是更新.otherwise()配置。例如:

var app = angular.module('myapp',['ionic']);

app.controller('$scope', '$state','$http', [function($scope, $state, $http){
   $http.get('my/api/path')
   .then(function(response){
        if(response.authenticated){
            $state.go('secret.route');
        } else {
            $state.go('public.route');
        }
   });
}]);