在$ q.reject上没有调用$ routeChangeError

Asa*_*saf 11 javascript angularjs angular-routing sails.js


我有一个带有Sails JS后端的Angular JS应用程序,并且在路径内(在app.js中)我有:

.state('app.detail', {
  url: "/detail",
  views: {
    'menuContent' :{
      templateUrl: "templates/detail.html",
      controller: 'UserUpdateCtrl',
      resolve: {
        auth: ["$q", "userData", function($q, userData) {
          var userInfo = userData.getUserInfo();
          if (userInfo) {
            return $q.when(userInfo);
          } else {
            return $q.reject({ authenticated: false });
          }
        }]
      },
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

(这是遵循本指南)

现在在同一个文件中,我有$ routeChangeError:

.run(function($rootScope) {
  $rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) {
    if (eventObj.authenticated === false) {
      $location.path("/login");
    }
  });
Run Code Online (Sandbox Code Playgroud)

在chrome上调试时,我看到函数已定义,但未调用.
我在这里错过了什么?

Ter*_*rry 12

好吧,假设您正在使用Angular UI路由器,我相信您只是错误地从官方路由器中翻译错误处理程序.

来自以下文档$state:

在转换期间发生错误时触发.重要的是要注意,如果您的解析函数(javascript错误,不存在的服务等)中有任何错误,它们将不会传统抛出.您必须侦听此$ stateChangeError事件以捕获所有错误.

并且此处理程序的参数不同,请尝试以下操作:

$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
  if (error && !error.authenticated) {
    $location.path("/login");
  }
});
Run Code Online (Sandbox Code Playgroud)

这是一个参数的描述,重要的是粗体:

  • event - {Object} - 事件对象.
  • toState - {State} - 正在转变的州.
  • toParams - {Object} - 提供给toState的参数.
  • fromState - {State} - 当前状态,转换前.
  • fromParams - {Object} - 提供给fromState的params.
  • 错误 - {错误} - 解决错误对象.

  • 来吧男人这里有你的问题的模式,你使用$ state而不是$ location.阅读文档,它可能应该是`$ state.go()`或其他东西. (3认同)