Angular: как обновить метод ngOnInit

#javascript #angular #typescript

#javascript #angular #typescript

Вопрос:

У меня есть боковая панель с различными перенаправлениями определенных категорий продуктов, при нажатии на эти кнопки она перенаправляется на компонент, который получает параметры URL-адреса и обращается к сервису и извлекает данные этой конкретной категории, дело в том, что при первом нажатии на нее это работает, но во второйкогда этого не происходит, он только изменяет URL-адрес, но не обновляет данные

sidebar.component.html

 <div class="list-group">
  <a [routerLink]="['products/category']" [queryParams]="{name:category.name}" class="list-group-item"
     *ngFor="let category of categories">{{category.name}}</a>
</div>
  

И компонент, который делает волшебство

 export class ViewAllProductsByCategoryComponent implements OnInit {
  searchCategory: any;
  products: Product;

  constructor(private activatedRoute: ActivatedRoute, private productsService: ProductsService) {
  }

  ngOnInit(): void {
    
    this.activatedRoute.queryParams.subscribe(res => {
      this.searchCategory = res.name;
    });
    this.productsService.searchCategoryProducts(this.searchCategory).subscribe(res => {
      this.products = res;
      console.log(this.products);
    });
  }

}
  

Итак, как мне обновить данные?

Ответ №1:

Angular по умолчанию не выполняет повторную инициализацию уже загруженного компонента.

Но есть способ обойти эту функцию:

 let newLocation = `/pathName/5110`;
 // override default re use strategy
 this.router
    .routeReuseStrategy
    .shouldReuseRoute = function () {
        return false;
 };
 this.router
   .navigateByUrl(newLocation)
   .then(
   (worked) => {
     // Works only because we hooked
     // routeReuseStrategy.shouldReuseRoute 
     // and explicitly told it don't reuse
     // route which forces a reload.
     // Otherwise; the url will change but new
     // data will not display!
   },
   (error) => {
    debugger;
    }
 );
  

Просто установите для функции .shouldReuseRoute значение false, чтобы компонент перезагрузился.

Вот более подробная информация по этой теме. https://dev.to/jwp/angular-s-naviation-challenges-20i2

Вы также можете настроить маршрутизатор для повторного использования маршрута.

Ответ №2:

Я немного изменил ответ Джона, вот как я это исправил

  export class ViewAllProductsByCategoryComponent implements OnInit, OnDestroy {
      searchCategory: any;
      products: Product;
      mySubscription: any;
    
      constructor(private activatedRoute: ActivatedRoute,
                  private productsService: ProductsService,
                  private router: Router,
      ) {
        this.router.routeReuseStrategy.shouldReuseRoute = () => {
          return false;
        };
        this.mySubscription = this.router.events.subscribe((event) => {
          if (event instanceof NavigationEnd) {
            this.router.navigated = false;
          }
        });
    
      }
    
      ngOnInit(): void {
        this.activatedRoute.queryParams.subscribe(res => {
          this.searchCategory = res.name;
          console.log(this.searchCategory);
        });
    
        this.productsService.searchCategoryProducts(this.searchCategory).subscribe(res => {
          this.products = res;
          console.log(this.products);
        });
      }
    
      ngOnDestroy(): void {
        if (this.mySubscription) {
          this.mySubscription.unsubscribe();
        }
      }
    
    }