Javascript AngularJS多重分辨

Javascript AngularJS多重分辨,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,这是我的ui路由器特定路由的配置 state('app.merchant', { url: '/start/merchant', views: { 'mainView': { templateUrl: "partials/start_merchant.html" } },

这是我的
ui路由器
特定路由的配置

state('app.merchant', {
                url: '/start/merchant',
                views: {
                    'mainView': {
                        templateUrl: "partials/start_merchant.html"
                    }
                },
                css: ['assets/vendor/bootstrap/dist/css/bootstrap.css','assets/css/styles.css','assets/css/plugins.css'],
                title: 'Buttons',

                resolve: {
                    userRequired: userRequired,
                }

                resolve: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')

            })
问题是,即使页面不满足
userRequired
要求,也会显示该页面。这是
userRequired
的功能:

function userRequired($q, $location, $auth,Account) {
      var deferred = $q.defer();
      if ($auth.isAuthenticated()) {

          Account.getUserStatus()
              .then(function(response){
                if(response.data == true){
                    deferred.resolve();
                }
                  else{
                    deferred.reject();
                }
              })
              .catch(function(response){
                  console.log("Error has occur, Please contact adminstrator");
              });
      } else {
          deferred.resolve();
      }
      return deferred.promise;
    }
function userRequired($location, $auth, Account) {

  if ($auth.isAuthenticated()) {

      Account.getUserStatus()
          .then(function(response){
            if(response.data == true){
                console.log('Logged in!');
            } else {
                console.log('Not authorized!');
                $location.url('/logout');
            }
          })
          .catch(function(response){
              console.log("Error has occurred, please contact administrator.");
              $location.url('/logout');
          });
  } else {
      console.log('Not authorized!');
      $location.url('/logout');
  }
}
如何解决这个问题?谢谢

编辑

加载顺序:

function loadSequence() {
        var _args = arguments;

        return {
            deps: ['$ocLazyLoad', '$q',
            function ($ocLL, $q) {
                var promise = $q.when(1);
                for (var i = 0, len = _args.length; i < len; i++) {
                    promise = promiseThen(_args[i]);
                }
                return promise;

                function promiseThen(_arg) {

                    if (typeof _arg == 'function')
                        return promise.then(_arg);
                    else
                        return promise.then(function () {
                            var nowLoad = requiredData(_arg);
                            //console.log(nowLoad)
                            if (!nowLoad)
                                return $.error('Route resolve: Bad resource name [' + _arg + ']');
                            return $ocLL.load(nowLoad);
                        });
                }

                function requiredData(name) {
                    if (jsRequires.modules)
                        for (var m in jsRequires.modules)
                            if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
                                return jsRequires.modules[m];
                    return jsRequires.scripts && jsRequires.scripts[name];
                }
            }]
        };
    }
函数loadSequence(){
var_args=参数;
返回{
部门:['$ocLazyLoad','$q',
函数($ocLL,$q){
风险值承诺=$q.when(1);
对于(变量i=0,len=_args.length;i
当getUserStatus()服务引发异常(在.catch()中)时,您不能拒绝承诺,而且当未经身份验证的服务必须拒绝时,请尝试以下解决方案:

state('app.merchant', {
    url: '/start/merchant',
    views: {
        'mainView': {
            templateUrl: "partials/start_merchant.html"
        }
    },
    css: ['assets/vendor/bootstrap/dist/css/bootstrap.css','assets/css/styles.css','assets/css/plugins.css'],
    title: 'Buttons',
    resolve: {
        userRequired: userRequired,
        loadSequence: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
    }
})

function userRequired($q, $location, $auth,Account) {
  return $q(function(resolve, reject) {
    if ($auth.isAuthenticated()) {
        Account.getUserStatus()
            .then(function(response){
              if(response.data == true){
                resolve();
              }
                else{
                reject();
              }
            })
            .catch(function(response){
              console.log("Error has occur, Please contact adminstrator");
              reject()
            });
    } else {
        reject()
    }
  });
}

function loadSequence() {
    var _args = arguments;

    return ['$ocLazyLoad', '$q', function ($ocLL, $q) {
            var promise = $q.when(1);
            for (var i = 0, len = _args.length; i < len; i++) {
                promise = promiseThen(_args[i]);
            }
            return promise;

            function promiseThen(_arg) {

                if (typeof _arg == 'function')
                    return promise.then(_arg);
                else
                    return promise.then(function () {
                        var nowLoad = requiredData(_arg);
                        //console.log(nowLoad)
                        if (!nowLoad)
                            return $.error('Route resolve: Bad resource name [' + _arg + ']');
                        return $ocLL.load(nowLoad);
                    });
            }

            function requiredData(name) {
                if (jsRequires.modules)
                    for (var m in jsRequires.modules)
                        if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
                            return jsRequires.modules[m];
                return jsRequires.scripts && jsRequires.scripts[name];
            }
        }]
}
状态('app.merchant'{
url:“/start/merchant”,
观点:{
“主视图”:{
templateUrl:“partials/start\u merchant.html”
}
},
css:['assets/vendor/bootstrap/dist/css/bootstrap.css'、'assets/css/styles.css'、'assets/css/plugins.css'],
标题:“按钮”,
决心:{
userRequired:userRequired,
loadSequence:loadSequence('flow'、'angularFileUpload'、'merchantwizardtrl')
}
})
需要函数userq($location,$auth,Account){
返回$q(函数(解析、拒绝){
如果($auth.isAuthenticated()){
Account.getUserStatus()
.然后(功能(响应){
如果(response.data==true){
解决();
}
否则{
拒绝();
}
})
.catch(函数(响应){
日志(“发生错误,请联系管理员”);
拒绝
});
}否则{
拒绝
}
});
}
函数loadSequence(){
var_args=参数;
返回['$ocLazyLoad','$q',函数($ocLL,$q){
风险值承诺=$q.when(1);
对于(变量i=0,len=_args.length;i
  • 将defer方法更改为Promise A+方法(我推荐这种方法)

  • 在.catch中添加reject()

  • 未经身份验证时拒绝

我认为问题在于,您返回了一个承诺,通过设计,该承诺将允许您的应用程序在尝试确定
UserRequired
是否有效时继续加载

因此,与其使用像promise这样的异步方法,不如同步地解决依赖关系,这样可以防止页面加载

下面是我如何修改
UserRequired

function userRequired($q, $location, $auth,Account) {
      var deferred = $q.defer();
      if ($auth.isAuthenticated()) {

          Account.getUserStatus()
              .then(function(response){
                if(response.data == true){
                    deferred.resolve();
                }
                  else{
                    deferred.reject();
                }
              })
              .catch(function(response){
                  console.log("Error has occur, Please contact adminstrator");
              });
      } else {
          deferred.resolve();
      }
      return deferred.promise;
    }
function userRequired($location, $auth, Account) {

  if ($auth.isAuthenticated()) {

      Account.getUserStatus()
          .then(function(response){
            if(response.data == true){
                console.log('Logged in!');
            } else {
                console.log('Not authorized!');
                $location.url('/logout');
            }
          })
          .catch(function(response){
              console.log("Error has occurred, please contact administrator.");
              $location.url('/logout');
          });
  } else {
      console.log('Not authorized!');
      $location.url('/logout');
  }
}

首先,您的配置对象具有两倍的相同属性:

{
    resolve: {userRequired: userRequired}
    resolve: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
}
您应该有如下内容:

{
    resolve : {
        userRequired : userRequired,
        loadSequence :    loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
}
同样,你的捕获物也应该返回一个被拒绝的承诺

return $q.reject();
如上所述,未经认证时拒绝。
您可以在chrome中进行调试,以确保调用了所有承诺并返回正确的值。

其他情况是否需要延迟。拒绝(),因为$auth.isAuthenticated())将为false?@mindparse如果我应用答案并禁用loadsequence,请解决它的问题。否则它仍然会加载页面。这应该是
$ocLazyLoad
而不是
$ocLL
,或者它也是这样工作的吗?您可以使用
$rootScope.$on('$stateChangeError',function(event,toState,toParams,fromState,fromsparams,error){console.log(error)}
若要记录路由未解决的任何原因,在ui router中,所有错误都会拒绝解决。A我看到错误,您有两个解决方案,请更新答案。是的,我需要两个。加载顺序是将所有依赖项加载到控制器。我更新我的答案,当您需要两个解决方案时,请将它们放置在同一个对象中。已尝试过,它给出了一个错误。.
参数“fn”不是函数,Get对象
使用正确的loadSequence函数更新答案