2016-09-09 22 views
7

rozwiązać metodę w przykładzie na angular.io zwraca obietnicę lub nawiguje aplikacji do określonej trasy, jeśli nie znaleziono żadnych danych.Resolve Guard: Prawidłowy sposób rozwiązania obserwowalnego z Routes, jeśli nie znaleziono żadnych danych

resolve(route: ActivatedRouteSnapshot): Promise<any> { 
let id = +route.params['id']; 
return this.cs.getCrisis(id).then(crisis => { 
    if (crisis) { 
    return crisis; 
    } else { // id not found 
    this.router.navigate(['/crisis-center']); 
    return false; 
    } 
}); 
} 

Załóżmy, że funkcja getCrisis powrocie zauważalny:

resolve(route: ActivatedRouteSnapshot): Observable<any> { 
    let id = +route.params['id']; 
    return this.cs.getCrisis(id).take(1) 
} 

w przypadku zaobserwowania. Skąd mam wiedzieć, że nic nie jest zwracane, ponieważ mam do czynienia ze strumieniem? jaki byłby najlepszy wzór do obsługi tego przypadku w funkcji rozstrzygania?

Wiem, że mogłem użyć metody router.navigate użytkownika z komponentu, ale chciałbym użyć routera rozwiązać problem poprawnie.

+0

nie wiem zrozumieć pytanie. Co nie działa? –

Odpowiedz

5

Być może trzeba dodać .first() (musi być importowane), ponieważ obecnie router czeka na obserwowalne do ukończenia i że nie może się zdarzyć w zależności od tego, co robi getCrisis():

resolve(route: ActivatedRouteSnapshot): Observable<any> { 
    let id = +route.params['id']; 
    return this.cs.getCrisis(id) 
    .map(data => { 
    if(data) { 
     return crisis; 
    } else { 
     this.router.navigate(['/crisis-center']); 
     return false; 
    } 
    }) 
    .first() 
} 
+0

Zaktualizowałem moje pytanie metodą rozwiązywania problemu, zwracając możliwą do zapamiętania odpowiedź: – Alex

+0

Zaktualizowałem moją odpowiedź. Po prostu zmień 'then' na' map' ;-) –

+1

.map po prostu przekształcenie strumienia, ale router jest w stanie go rozwiązać ... – Alex