programing

UI 라우터 해결 함수의 처리 오류입니까?(일명 $state)ChangeError) 데이터를 오류 상태로 전달하시겠습니까?

easyjava 2023. 3. 15. 20:00
반응형

UI 라우터 해결 함수의 처리 오류입니까?(일명 $state)ChangeError) 데이터를 오류 상태로 전달하시겠습니까?

내 안에Angular응용 프로그램 I는 경유로 루트/상태를 처리합니다.ui-router모든 것이 잘 되면, 그것은 훌륭하다.그러나 내부에서 발생하는 오류를 처리하는 좋은 방법은 무엇입니까?resolve기능하고 있습니까?

현재 솔루션:전용이 있습니다.error상태(일반과 유사)404.html)는 다음과 같습니다.

// inside config()
.state('error', {
  url: '/error',
  controller: 'ErrorCtrl',
  templateUrl: 'error.html' // displays an error message
})

내부에서 오류가 발생한 경우resolve방송으로 잡습니다.$stateChangeError단위는 mrun기능:

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-routeresk way.

현재의 솔루션에서는$stateParams에러 데이터에 대해서error상태. 단, 이 경우 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어떤 상태입니까? (주의:나의error오브젝트는 단순한 문자열이 아니라 복잡합니다.)

나에게 효과가 있었던 전략은 그 모든 것을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');
    }
});

오류 컨트롤러 또는 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
});

도움이 되었으면 좋겠다

url: 옵션 전체를 삭제하고 params: 옵션만으로 대체할 수 있습니다.

                .state('error', {
                    abstract: false,
                    templateUrl: templateFor('error'),
                    controller: controllerFor('error'),
                    params: { 'error': 'An error has occurred' },
                    resolve: {
                        error: [
                            '$stateParams', function ($stateParams) {
                                return  $stateParams.error;
                            }
                        ]
                    }
                })

여기서 추악한 URL은 없어지고 컨트롤러는 에러를 파라미터로 취득할 수 있습니다.

언급URL : https://stackoverflow.com/questions/22936865/handling-error-in-ui-routers-resolve-function-aka-statechangeerror-passing-d

반응형