2015-01-18 2 views
0

각도 응용 프로그램에 숨겨진 페이지가 있으므로 특수 ID 사용자 만 액세스 할 수 있습니다. 그것을 구현하기 위해 상태가 그 숨겨진 상태로 바뀔 때 HTTP가 서버에 요청을 보냅니다 (서버 만이 특별한 id를 알고 있기 때문에).상태가 변경 될 때까지 약속을 해결하십시오.

그리고 서버가 오류 메시지와 함께 응답하면 상태 변경 프로세스가 중지되고 다른 경우 사용자는 해당 특수 페이지로 이동합니다. 서비스

angular 
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) { 
    var id = mySvc.getId();  
    $rootScope.$on('$stateChangeStart', function(event, toState , toParams, fromState, fromParams) { 

     if(toState.name === "specialstate") { 
      mySvc.check(id) 
       .then(function(result) { 
        if(result.error !== 0) { 
         event.preventDefault(); 
        } 
       }, function(error) { 
        event.preventDefault(); 
       });     
     } 

    }); 
}]); 

기능 :

 function check(id) { 
     var deferred = $q.defer(); 
     $http({ 
      url: "/api/url", 
      method: "GET", 
      headers: {'Content-Type': 'application/json'} 
      }). 
      then(function (result) { 
       console.log(result); 
       if(result.data.error === 0) { 
        deferred.resolve(result.data); 
       } 
       else { 
        deferred.reject(result.data); 
       } 
      }, function (error) { 
       deferred.reject(error); 
      }); 
     return deferred.promise; 
    }; 

모든 것이 한 가지를 제외하고, 권리 : 상태는 요청 결과를 기다리지 않고 변경되는 다음

내가 사용하고있는 코드입니다. 내가 해결 방법을 사용해야한다고 생각하지만 제대로 사용하는 방법을 모르겠습니다.

감사합니다.

+0

약속은'$ stateChangeStart' 이벤트 핸들러가 실행을 마친 후에 오랫동안 해결 될 것입니다. 그때까지는'event.preventDefault()'를 너무 늦게 호출 할 것이고 효과가 없을 것이다. 이 방법이 효과가 없기 때문에 접근 방법을 다시 생각해 봐야한다고 생각합니다. – JLRishe

답변

0

ui-router는 상태 변환이 허용되기 전에 해결되어야하는 데이터 집합을 정의하는 resolve 개체를 지원합니다 (예 : 서버에서).

.state('hidden', { 
    url: '/hidden', 
    ... 
    resolve: { 
    data: function(mySvc) { 
     var id = mySvc.getId();  
     return mySvc.check(id).then(function(result) { 
     if (result.error !== 0) { 
      throw new Error("not allowed"); 
     } 
     }); 
    } 
    } 
}); 

숨겨진 상태에서 컨트롤러이 사용할 수있는 정의 된 data 목적은, 단지 경우에 그것이가 2xx 상태 코드를 반환하고 0

데이터가 해결되면

과 동일한 error 속성이있다, 상태 변경이 발생하고 컨트롤러가 인스턴스화됩니다. 거절의 경우, 이것의 아무 것도 일어나지 않는다.

개인 메모로서, 나는 권한 부여를 처리하는 훌륭한 장치라는 것을 알았습니다.

관련 문제