Маршрутизатор Navigate не вызывает ngOnInit, когда та же страница

Я вызываю router.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. Вот как это сделать.

  1. Введите следующий импорт подписки rxjs. import { Subscription } from 'rxjs/Subscription';

  2. Добавьте OnDestory в свой Angular Core Import. import { Component, OnDestroy, OnInit } from '@angular/core';

  3. Добавьте OnDestory в свой класс экспорта. export class DisplayComponent implements OnInit, OnDestroy {

  4. Создайте свойство объекта со значением Subscription из rxjs в своем классе экспорта для каждой подписки в компоненте. myVariable: Subscription;

  5. Установите для своей подписки значение MyVariable: подписки. this.myVariable = this.rmanagerService.getRPDoc(books[i].books.id).subscribe(value => {});

  6. Затем, прямо под ngOninit, поместите хук жизненного цикла ngOnDestory() и вставьте свое выражение об отказе от подписки для вашей подписки. Если у вас есть несколько, добавьте больше ngOnDestroy() { this.myVariable.unsubscribe(); } ngOnDestroy() { this.myVariable.unsubscribe(); }

Ответ 6

Рассмотрим перемещение кода, который вы имели в ngOnInit, в ngAfterViewInit. Последнее, похоже, называется навигацией маршрутизатора и должно помочь вам в этом случае.

Ответ 7

Если вы хотите, чтобы маршрутизатор перешел на ту же страницу и захотел вызвать ngOnInit(), вам это нужно, например,

this.router.navigate(['category/list', категория])     .then(() => window.location.reload());