Я вызываю router.navigate
на той же странице с некоторыми параметрами строки запроса. В этом случае ngOnInit()
не вызывает. Это по умолчанию или мне нужно добавить что-нибудь еще?
Маршрутизатор Navigate не вызывает ngOnInit, когда та же страница
Ответ 1
Вы можете ввести ActivatedRoute
и подписаться на params
constructor(route:ActivatedRoute) {
route.params.subscribe(val => {
// put the code from `ngOnInit` here
});
}
Маршрутизатор только уничтожает и воссоздает компонент при переходе на другой маршрут. Когда обновляются только параметры маршрута или параметры запроса, но маршрут один и тот же, компонент не будет уничтожен и воссоздан.
Альтернативный способ принудительного воссоздания компонента - использовать пользовательскую стратегию повторного использования. См. Также Angular2 router 2.0.0, не перезагружая компоненты, когда тот же URL-адрес загружен с различными параметрами? (похоже, пока еще мало информации о том, как его реализовать )
Ответ 2
Вы можете настроить повторное использованиеStrategy на маршрутизаторе.
constructor(private router: Router) {
// override the route reuse strategy
this.router.routeReuseStrategy.shouldReuseRoute = function() {
return false;
};
}
Ответ 3
Возможно, вам нужна перезагрузка страницы? Это мое решение: я изменил свой @NgModule (в моем случае это файл app-routing.module.ts):
@NgModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})] })
Ответ 4
NgOnInit
будет вызываться один раз при создании экземпляра. Для того же экземпляра NgOnInit
больше не будет вызываться. Чтобы вызвать его, необходимо уничтожить созданный экземпляр.
Ответ 5
Эта проблема, вероятно, связана с тем фактом, что вы не прекращаете подписку с помощью ngOnDestroy. Вот как это сделать.
-
Введите следующий импорт подписки rxjs.
import { Subscription } from 'rxjs/Subscription';
-
Добавьте OnDestory в свой Angular Core Import.
import { Component, OnDestroy, OnInit } from '@angular/core';
-
Добавьте OnDestory в свой класс экспорта.
export class DisplayComponent implements OnInit, OnDestroy {
-
Создайте свойство объекта со значением Subscription из rxjs в своем классе экспорта для каждой подписки в компоненте.
myVariable: Subscription;
-
Установите для своей подписки значение MyVariable: подписки.
this.myVariable = this.rmanagerService.getRPDoc(books[i].books.id).subscribe(value => {});
-
Затем, прямо под ngOninit, поместите хук жизненного цикла ngOnDestory() и вставьте свое выражение об отказе от подписки для вашей подписки. Если у вас есть несколько, добавьте больше
ngOnDestroy() { this.myVariable.unsubscribe(); }
ngOnDestroy() { this.myVariable.unsubscribe(); }
Ответ 6
Рассмотрим перемещение кода, который вы имели в ngOnInit, в ngAfterViewInit. Последнее, похоже, называется навигацией маршрутизатора и должно помочь вам в этом случае.
Ответ 7
Если вы хотите, чтобы маршрутизатор перешел на ту же страницу и захотел вызвать ngOnInit(), вам это нужно, например,
this.router.navigate(['category/list', категория]) .then(() => window.location.reload());