Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理ui路由器解析函数中的错误?(aka$stateChangeError)将数据传递到错误状态?_Javascript_Angularjs_Angular Ui Router - Fatal编程技术网

Javascript 处理ui路由器解析函数中的错误?(aka$stateChangeError)将数据传递到错误状态?

Javascript 处理ui路由器解析函数中的错误?(aka$stateChangeError)将数据传递到错误状态?,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,在我的Angular应用程序中,我通过ui路由器处理路由/状态。如果一切顺利,那就太好了。但是,处理resolve函数内部发生的错误的好方法是什么 我当前的解决方案: 我有一个专用的错误状态(类似于常见的404.html)。看起来是这样的: // inside config() .state('error', { url: '/error', controller: 'ErrorCtrl', templateUrl: 'error.html' // displays an error

在我的
Angular
应用程序中,我通过
ui路由器处理路由/状态。如果一切顺利,那就太好了。但是,处理
resolve
函数内部发生的错误的好方法是什么

我当前的解决方案: 我有一个专用的
错误
状态(类似于常见的
404.html
)。看起来是这样的:

// inside config()
.state('error', {
  url: '/error',
  controller: 'ErrorCtrl',
  templateUrl: 'error.html' // displays an error message
})
如果在
resolve
中发生错误,我将通过m
run
函数中广播的
$stateChangeError
捕捉该错误:

angular.module('myModule').run(function($state) {
  $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {
    event.preventDefault();
    $state.go('error');
  });
});
这是可行的,但是我想根据错误更改
'error.html'
中的错误消息。我不想污染
$rootScope
,我想用
ui路由器的esk方式来做

我当前的解决方案使用
$stateParams
将错误数据添加到我的
错误
状态,但我必须为此使用JSONified查询参数,并获得一个非常难看的URL:

// inside config()
.state('error', {
  url: '/error?data&status&config', // accept these three params
  controller: 'ErrorCtrl',
  templateUrl: 'error.html' // displays an error message
})

angular.module('myModule').run(function($state) {
  $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {
    event.preventDefault();
    $state.go('error', JSON.stringify(error)); // error has data, status and config properties
  });
});
问题
是否有其他方法可以将
error
对象传递到我的
error
状态,而不丑化我的URL?(注意:我的
error
对象很复杂,而不仅仅是一个简单的字符串。)

您可以通过服务传递数据,您应该在错误控制器或错误状态的onEnter方法中访问这些数据

或者您可以“丰富”错误状态。也许这不是角度的方式,但我的意思是:

$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
  event.preventDefault();
  $state.get('error').error = { code: 123, description: 'Exception stack trace' }
  return $state.go('error');
});
在错误状态配置中:

.state('error', {
    url: 'error',
    resolve: {
        errorObj: [function () {
            return this.self.error;
        }]
    },
    controller: 'ErrorCtrl',
    templateUrl: 'error.html' // displays an error message
});

希望这有帮助

一个对我有效的策略是让
resolve
函数使用错误对象返回被拒绝的承诺

$stateProvider.state('needs_authentication', {
    url: '/auth',
    resolve: {
        user: function ($q, authService) {
            if (authService.isAuthenticated()) {
                ...
            }
            else {
                var errorObject = { code: 'NOT_AUTHENTICATED' };
                return $q.reject(errorObject);
            }
        }
    }
});
这使您的
$stateChangeError
函数能够处理特定的错误情况:

$rootScope.$on('$stateChangeError', function (evt, toState, toParams, fromState, fromParams, error) {
    if (angular.isObject(error) && angular.isString(error.code)) {
        switch (error.code) {
            case 'NOT_AUTHENTICATED':
                // go to the login page
                $state.go('login');
                break;
            default:
                // set the error object on the error state and go there
                $state.get('error').error = error;
                $state.go('error');
        }
    }
    else {
        // unexpected error
        $state.go('error');
    }
});

您可以删除整个url:选项,并将其替换为一个params:选项


现在没有难看的url了。控制器可以将错误作为参数来获取。

更简洁、更惯用的方法。您将$rootScope.$on放在哪里?@Benny$rootScope.$on放在run()函数中,有关更多信息,请参阅@Miller perfect!谢谢你的提示,这解决了我的问题@Miller也在做同样的事情。除了我不想在出现错误时更改url之外,我只想显示错误页面。我尝试了$state.go('error',null,{location:false});如果是第一次加载页面,则该选项有效。但是,当您单击一个链接将您带到这个错误状态时,它不会将url更改为目标状态url。有办法做到这一点吗?
                .state('error', {
                    abstract: false,
                    templateUrl: templateFor('error'),
                    controller: controllerFor('error'),
                    params: { 'error': 'An error has occurred' },
                    resolve: {
                        error: [
                            '$stateParams', function ($stateParams) {
                                return  $stateParams.error;
                            }
                        ]
                    }
                })