2017-01-26 5 views
2

경로 정의에 정의 된 roleAccess 속성뿐만 아니라 사용자의 역할도 확인해야하는이 경로 보호 기능이 있습니다.각도 2 경로 보호 장치가 값을 설정할 때까지 대기하지 않습니다.

내가 직면하고있어 문제는 .map은 그게 .map 실행을 허용해야한다 (는 @ngrx/storenull로 시작합니다) 거짓 인 경우에만 관계없이 accounts.isSelfPending의 실행 것입니다.

어떻게하면됩니까?

편집 : 나는 내 질문이 조금 애매 할 수 있다는 것을 깨닫게, 내가 필요로 무엇 컴퍼넌트 계층까지 높은 발사하고 저장소에 저장되어있는 /self 요청에서 사용자의 정보를 기다리는 것입니다.

문제는 DashboardComponent에 해고 되었음에도 불구하고 /self 요청이 실행되지 않고 있으며 이는 차례대로 AdsComponent을 라우팅의 하위 항목으로 유지합니다. (어느 내가 현재이 경비원과 잠그려고 노력하고있는 길이다).

/self 요청이 왜 발생하지 않습니까? 내가 생각하기에이 문제의 일부입니다. 실현 후

return this.store.select('accounts') 
    .let((state: Observable<IAccountsStorage>) => state.filter((accounts: IAccountsStorage) => accounts.isSelfPending !== null && accounts.isSelfPending === false))) 
    .map((accounts: IAccountsStorage) => { 

    this.route.data.subscribe(
     data => { 

     if (accounts.self) { 

      if (accounts.self.role !== data['roleAccess'] && (data['roleAccess'] !== 0 || data['roleAccess'] !== undefined || data['roleAccess'] !== null)) { 
      return this.router.navigateByUrl('admin/dashboard'); 
      } 
      else { 
      return true; 
      } 
     } 
     } 
    ); 
    } 
).first(); 
+0

구조를 따라하기가 약간 어렵습니다. 내가 너를 도우려고 Pb를 책정 할 Plunkr을 만들 수 있다고 생각하니? :) – Maxime

+0

@Maxime 나는 그 순간 더 많은 시간을 보내고 싶었지만, 나는 다른 방향으로 나아가는 괜찮은 해결책을 찾을 수 있었다. 내 대답을 보시다시피. – Chrillewoodz

답변

0

그 가운데 사람이 그냥 의도 한대로 실제로 작동 훨씬 명확 가드로 끝나는 직접 API를 호출하기로 결정 너무 많은 문제가 발생되었을 때 저장소를 사용. 누군가가 난으로 제공하십시오 원래의 코드와 함께 문제를 해결하는 방법을 알고 있다면, 그러나

canLoad(): Observable<boolean> { 

    return this.accountsApi.getSelf() 
    .map(res => { 

     if (res.data.role === 1) { 
     return true; 
     } 
     else { 
     return this.router.navigate(['admin/dashboard']); 
     } 
    }) 
    .catch(err => { 
     return this.router.navigate(['admin/dashboard']); 
    }); 
} 

:

나는이 다른 사람이 내가 여기에 최종 솔루션을 떠날거야 도움이 될 것으로 생각 실제로 상점을 사용하여 호기심을 일으키는 방법.

0

1 년 후인 줄 알지만 Stores and Guards와 비슷한 문제가 있습니다. I 사용자가 처음으로 NULL 사용자 개체가있는 상태 - 기존 토큰에서 사용자를 설정할 때 잠시 동안 만 문제가 있다고 생각하십시오. NULL 먼저 통해 제공하지만,이 같은 필터링 될 필요가 있다고

:

canLoad(route: Route): Observable<boolean> | Promise<bolean> | boolean { 
    return this.store.select(fromRoot.getUser) 
     .filter(user => user != null) // ** THIS IS THE KEY TO SKIP NULL USER ** 
     .map(user => { 
      //code t check user role 
     }).take(1); // or .first() -- doesn't seem to be necessary for canActivate guards 
} 

참고 : 위의 코드는 현재 스토어 코드 작성 방법을 반영한다 - 또는, 적어도,이 방법 후에 모방 것을 현재 ngrx/store 4.x code examples이 쓰여졌습니다. 원래의 질문과 다른 구조입니다.