Может быть, функция resolve
запущена до того, как queryParams
заполняется в URL. Попробуйте сделать это Rxjs
способом.
import { filter, map, switchMap, tap } from 'rxjs/operators';
...
export class UserResolver implements Resolve<User[]> {
constructor(private userService: UserService, private route: ActivatedRoute) { }
resolve(): Observable<User[]> {
return this.route.queryParams.pipe(
tap(params => console.log(`Params: ${params}`)),
// wait until params has user in it
filter(params => !!params['user']),
tap(params => console.log('after filter')),
// extract the value of the user param
map(params => params['user']),
// switch to a new observable stream once we know the searchTerm
switchMap(searchTerm => this.userService.getUsers(searchTerm)),
);
}
}
Edit
Используйте оператор tap для отладки потока. Посмотрите, что это за журнал, и убедитесь, что console.log(
Params: $ {params} )
содержит пользовательские параметры.
Edit2
Попробуйте
this.router.navigateByUrl(`/search-result?user=${searchTerm}`);
, я думаю, что что-то не так с вашей навигацией.
Редактировать 3
Я думаю, queryParams
можно прочитать только тогда, когда компонент сам загружается, а не во время выполнения распознавателей маршрутов, потому что он говорит, мне нужно go к маршруту search-result
, дать мне данные до того, как я go до search-result
, и это не зависит от queryParams. Чтобы исправить это, я следовал этому руководству (https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html).
1.) В app-routing-module.ts
измените регистрацию пути на:
{ path: 'search-result/:user', component: UserListComponent, resolve: { users: UserResolver } },
Теперь пользователь будет параметром, за которым мы будем указывать в URL.
2.) В search.component.ts
измените search
на:
search(searchTerm: string) {
if (searchTerm) {
this.router.navigate([`search-result/${searchTerm}`]);
}
}
3.) В user-resolver.service.ts
измените его на:
@Injectable({
providedIn: 'root'
})
export class UserResolver implements Resolve<User[]> {
constructor(private userService: UserService) { }
resolve(route: ActivatedRouteSnapshot): Observable<User[]> {
const searchTerm: string = route.paramMap.get('user');
return this.userService.getUsers(searchTerm);
}
}
I, когда консоль регистрирует searchTerm, это точное значение. Спасибо за предоставление StackBlitz, это помогло вам и мне.