2016-12-30 2 views
6

У меня есть маршрут с параметром при переходе на страницу/users/123 где 123 - это параметр, вызываемый ngOnInit, я получаю свой параметр, и я вызываю свой метод, чтобы получить пользователя.Угловой 2: изменение параметров маршрута, перезагрузка одной и той же страницы?

Однако, когда я нахожусь на этой странице, и я нажимаю вторую ссылку/users/456, тогда ngOnInit больше не вызывается (поскольку эта страница уже создана). Поэтому без ngOnInit я не могу получить параметр маршрута и не могу вызвать мой метод, чтобы получить пользователя.

Если я перехожу к/users/123, то к/home, затем к/users/456, он работает явно.

Что я должен использовать, чтобы убедиться, что функция, которая получает параметр и получает пользователя, ВСЕГДА вызвана, даже если я уже на одной странице?

ответ

9

Вы можете использовать подписчик route.params слушать Пары-х изменение.

import { ActivatedRoute } from '@angular/router'; 

export class DemoPage { 
    constructor(private _route: ActivatedRoute) { } 
    ngOnInit() { 
      this._route.params.forEach(params => { 
        let userId = params["userId"]; 
        //call your function, like getUserInfo() 
      }) 
    } 
} 
1

OnInit вызывается только один раз, когда указывается директива.

Для контрольных маршрутов используйте ActivatedRoute.

constructor(private route: ActivatedRoute) { } 

ngOnInit(): void { 
    this.route.params.forEach((params: Params) => { 
     console.log(params); // Your params called every change 
    }); 
} 

Не забудьте импортировать:

import { ActivatedRoute, Params } from '@angular/router'; 

Подробнее о OnInit: OnInit - ts - API

Подробнее о ActivatedRoute: ActivatedRoute - ts - API

0

Хорошо, извините, ребята, я звонил, чтобы получить пользователя за пределами активированного обратного вызова.

Это правильно:

import { ActivatedRoute } from '@angular/router'; 

export class DemoPage { 
constructor(private _route: ActivatedRoute) { } 
ngOnInit() { 
     this._route.params.forEach(params => { 
       let userId = params["userId"]; 
       getUserInfo(userId); 
     }); 
    } 
} 

Что я сделал:

import { ActivatedRoute } from '@angular/router'; 

export class DemoPage { 
constructor(private _route: ActivatedRoute) { } 
ngOnInit() { 
     var userId = ""; 
     this._route.params.forEach(params => { 
      userId = params["userId"];                     
     }); 

     getUserInfo(userId) 
    } 
} 
4

Params является Observable. Поэтому вам нужно только один раз подписаться на наблюдаемый, и каждый раз, когда параметры меняются, вы получаете уведомление.

constructor(private route: ActivatedRoute) {} 

ngOnInit() { 
    this.route.params 
    .switchMap((params: Params) => /* load your user e.g. getUser(params['id']) */) 
    .subscribe(user => this.user = user); 
} 

Кроме того, необходимо импортировать ActivatedRoute и Params

import { ActivatedRoute, Params } from '@angular/router'; 
Смежные вопросы