#angular
#angular
Вопрос:
У меня есть маршрут с динамическим сегментом пути
const route:Routes=[
{path:'customers',component:CustomerComponent}
{path:'customers/:id',component:CustomerComponent}
]
Итак, в моем клиентском компоненте я извлекаю это с помощью
идентификатор: число;
constructor(private route:ActivatedRoute){}
ngOnInit(){
this.id= this.route.snapshot.params['id'];
console.log("Id is :",this.id)
}
Таким образом, консоль регистрирует «Id равен: 1», когда я иду по этому маршруту из другого компонента, или он работает должным образом, когда я иду по этому маршруту в первый раз «localhost: 4200 / customers / 1», Но проблема возникает. Я написал ссылку в
customers.html файл
<a [routerLink]="['/customer',2]">loadID2</a>
При нажатии на эту ссылку URL-адрес меняется на «localhost: 4200 / customers / 2», но журнал консоли не работает, он не показывает «Id is: 2», там нет журнала консоли.
Моя проблема, почему это происходит?, URL-адрес уже изменился, но ngOnInit не работает. Не могли бы вы, пожалуйста, помочь мне решить эту проблему
Комментарии:
1. попробуйте с paramMap angular.io/api/router/ParamMap
Ответ №1:
Вместо того, чтобы использовать ActivatedRoute.snapshot
для получения параметров маршрута, подпишитесь на ActivatedRoute.paramMap
наблюдаемый, чтобы получить новый id
:
this.route.paramMap.subscribe((params : ParamMap)=> {
this.id = params.get('id');
console.log("Id is :", this.id);
});
Комментарии:
1. это должно быть params=>{this.id= params.get(‘id’); }); потому что id — это число , но console.log(«Идентификатор равен :», this.id ); все еще не работает, но когда привязка «id» к <p> id равна: {{id}}</p>, она меняется должным образом. Моя проблема в том, почему журнал консоли не работает, это angular не запускает ngOnint, когда маршрут такой же, или что происходит в их.
2. Я думаю, что вы пытаетесь
console.log
выйти за рамкиsubscribe
вызова. ПосколькуparamMap
является наблюдаемым, вы увидите измененное значение только внутриsubscribe
обратного вызова. Внутриsubscribe
обратного вызова вы фактически реализуете Observer , у которого есть свойnext
метод, вызываемый при получении нового значения. Итак, если вы поместитеconsole.log
вngOnInit
вместо того, чтобы помещать внутри вызова subscribe, вы не увидите новое значение по мере его изменения.3. Да, вы правы, мы должны поместить это в subscribe. Но у меня есть вопрос, почему angular ngOnint не запускается при изменении пути маршрута, теперь мой код работает должным образом, спасибо за это.
4.
ngOnInit
вызывается только один раз, когда компонент впервые подвергся обнаружению изменений, поэтому вы увидитеconsole.log
выходные данные только один раз. Но если вы добавитеconsole.log
внутри вызова subscribe, то при получении наблюдателем следующего элемента будет вызван ваш реализованныйnext
метод, а также будет вызван вашconsole.log
(как вы добавили его при реализацииnext
метода вsubscribe
обратном вызове).