UI 라우터 리졸바에서 리다이렉트 하는 방법
ui-router 해결 내에서 리다이렉트를 시도하고 있는데 라우터 리졸바에서 재루팅 방법이 있는지 알고 싶습니다.현재 이것은 생각만큼 작동하지 않는다.
resolver(auth, $state){
if(!auth.isLoggedIn()){
$state.go('noLoggedInPath');
}
}
리졸바에서 올바르게 리다이렉트 하는 방법은 무엇입니까?
나의 임시 해킹은 이것인데 나는 그것이 불편하다.
resolver(auth, $state, $timeout){
if(!auth.isLoggedIn()){
$timeout(function () {
$state.go('noLoggedInPath');
}, 0);
}
}
Yauheni의 답변은 효과가 있지만, 이상한 타임아웃을 피하기 위해서는 약속을 거부하고 $state에서 그것을 잡을 수 있습니다.ChangeError 이벤트 및 리다이렉트를 수행합니다.이렇게...
state('admin', {
resolve: {
auth: function(UserService, $q, permissionService) {
var deferred = $q.defer();
return UserService.load().then(function(user){
if (permissionService.can(user, {goTo: state})) {
return deferred.resolve({});
} else {
return deferred.reject({redirectTo: 'some_other_state'});
}
});
}
}
});
그리고 UI 라우터는 항상 "stateChangeError"를 브로드캐스트하므로 다음과 같은 작업을 수행할 수 있습니다.
$rootScope.$on('$stateChangeError', function(evt, to, toParams, from, fromParams, error) {
if (error.redirectTo) {
$state.go(error.redirectTo);
} else {
$state.go('error', {status: error.status})
}
})
당신은 당신의 약속에 답할 수 있습니다.resolver
상태를 계속 탐색할지 여부를 나타내는 함수입니다.다른 곳으로 이동하기로 결정한 경우 - 약속을 거부하고 올바른 상태를 지정하십시오.
resolver($q, $state, $timeout, auth) {
var deferred = $q.defer();
// $timeout is an example; it also can be an xhr request or any other async function
$timeout(function() {
if (!auth.isLoggedIn()) {
// user is not logged, do not proceed
// instead, go to a different page
$state.go('noLoggedInPath');
deferred.reject();
} else {
// everything is fine, proceed
deferred.resolve();
}
});
return deferred.promise;
}
여기 플렁크루.
UPD: 코드가 업데이트되고 plunkr이 추가되었습니다.타임아웃 함수에 넣었을 경우에만 동작하는 것 같습니다.
나는 이것을 사용한다.
function Check($state, $q) {
var deferred = $q.defer();
if (condition) {
deferred.resolve();
}
else {
deferred.reject();
}
return deferred.promise.catch(function () { $state.go('path'); });
}
이것이 내가 실제로 하는 일이며, 더 나은 해결책을 찾을 수 없다.
resolver($q, $timeout, myService) {
if(!areParameterValuesValid() || !isEverythingLogicallyOk()){
var deferred = $q.defer();
$timeout(function() {
$state.go('somewhere');
deferred.reject();
});
return deferred.promise;
} else {
return myService.loadSomething(passingSomeParams);
}
}
나는 이렇게 이미 거절당한 약속을 돌려주는 것이 훨씬 더 명확한 대답이라고 생각한다.
resolver(auth, $state, $q){
if(!auth.isLoggedIn()){
$state.go('noLoggedInPath');
// Return rejected promise
return $q.reject();
}
return true;
}
redirectTo 구성과 함께 해결자 약속을 사용할 수 있습니다.
redirectTo: function($transition$) {
return $transition$.injector().getAsync('isNew').then(function(isNew) {
return isNew ? 'estate.edit' : 'estate.view';
});
},
나는 이 일에 대해 결심을 하는 것이 잘 되지 않았다.상태 객체의 데이터 속성에 대한 리다이렉트 함수를 실행하기 위해 이 게시물의 논리를 수정했습니다.그런 다음 $state를 이용할 수 있습니다.모듈의 실행 블록에서 $rootScope의 ChangeStart 이벤트를 변경하고 인젝터 서비스의 호출 메서드를 사용하여 지정한 조건에 따라 상태를 변경합니다.모듈 전체에서도 잘 작동합니다.
언급URL : https://stackoverflow.com/questions/29811045/how-to-redirect-in-a-ui-router-resolver
'programing' 카테고리의 다른 글
브라우저 인증 대화 상자를 표시하지 않으려면 어떻게 해야 합니까? (0) | 2023.03.16 |
---|---|
각도 JQuery가 없는 HTML 요소 높이 가져오기JS (0) | 2023.03.16 |
유형 스크립트로 대응 - 유형 { }에 유형에서 다음 속성이 누락됨 (0) | 2023.03.11 |
렌더링에서 아무것도 반환되지 않았습니다.이는 보통 반환문이 누락되었음을 의미합니다.또는 아무것도 렌더링하지 않으려면 null을 반환하십시오. (0) | 2023.03.11 |
Wordpress를 CMS로 사용하는 Symfony 2 응용 프로그램 (0) | 2023.03.11 |