Как получить текущие параметры маршрута при изменении маршрута в компоненте, не загруженном маршрутизатором - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь получить параметры из маршрута, который выглядит как "/ category /: cat1 /: cat2 / browse"

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

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute, Params, RoutesRecognized } from '@angular/router';

@Component({
  selector: 'app-breadcrumbs',
  templateUrl: './breadcrumbs.component.html',
  styleUrls: ['./breadcrumbs.component.scss'],
})
export class BreadcrumbsComponent implements OnInit {
  constructor(private activatedRoute: ActivatedRoute, router: Router) {
    router.events.subscribe(e => {
      activatedRoute.params.subscribe(params => {
        console.log({ params });
      });
    });
  }
  ngOnInit() {}
}

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Разве вы не хотите подписываться на параметры маршрута вместо параметров запроса. (то есть activRoute.params.subscribe вместо activRoute.queryParams.subscribe)

0 голосов
/ 12 ноября 2019

Я решил исправить это следующим образом:

1) Создать службу хлебных крошек, которая использует BehaviorSubject для получения обновлений для параметров

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { BreadcrumbsList } from './breadcrumbsList';
import { ParseErrorLevel } from '@angular/compiler';

@Injectable({
  providedIn: 'root'
})
// https://stackoverflow.com/questions/46047854/how-to-update-a-component-without-refreshing-full-page-angular
export class BreadcrumbsService {
  public breadcrumbsList: BehaviorSubject<BreadcrumbsList> = new BehaviorSubject({
    '@context': 'https://schema.org',
    '@type': 'BreadcrumbList',
    itemListElement: []
  });

  constructor() {}

  // https://developers.google.com/search/docs/data-types/breadcrumb#example
  updateParamMap(paramMap, root, suffix = null, endpoint = null) {
    const breadcrumbsList = {
      '@context': 'https://schema.org',
      '@type': 'BreadcrumbList',
      itemListElement: []
    };
    let position = 0;
    let curPath = '';
    console.log({ test: paramMap.get('level1') });
    for (var i = 0; i < 6; i++) {
      let level = paramMap.get('level' + i);
      if (i === 0) {
        level = root;
      }
      if (!level) {
        continue;
      }
      curPath += '/' + level;
      let item = {
        '@type': 'ListItem',
        position: i + 1,
        name: level,
        item: suffix ? curPath + '/' + suffix : curPath
      };
      breadcrumbsList.itemListElement.push(item);
    }
    if (endpoint) {
      let item = {
        '@type': 'ListItem',
        position: i + 2,
        name: endpoint
      };
      breadcrumbsList.itemListElement.push(item);
    }
    // update the breadcrumbs list for anything that is listening for updates
    this.breadcrumbsList.next(breadcrumbsList);
  }
}

2) В каждом загруженном компонентепо маршруту, который должен обновлять хлебные крошки, импортировать BreadcrumbService и добавить эту строку в ngOnInit()

this.breadcrumbsService.updateParamMap(this.route.snapshot.paramMap, 'assets', 'browse');

3) В компоненте breadcrumb подписать breadcrumbsList на обновления из BreadcrumbsService

import { Component, OnInit, Input } from '@angular/core';
import { BreadcrumbsList } from './breadcrumbsList';

@Component({
  selector: 'app-breadcrumbs',
  templateUrl: './breadcrumbs.component.html',
  styleUrls: ['./breadcrumbs.component.scss']
})
export class BreadcrumbsComponent implements OnInit {
  @Input() path: String[];
  breadcrumbsList: BreadcrumbsList;

  constructor(breadcrumbsService: BreadcrumbsService) {
    breadcrumbsService.breadcrumbsList.subscribe(value => {
      this.breadcrumbsList = value;
    });
  }

  ngOnInit() {}
}

И шаблон хлебных крошек может обрабатывать BreadcrumbsList

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...