如何在路由器未加载的组件中的路由更改中获取当前路由参数
How to get the current route params on route changes in a component not loaded by the router
我正在尝试从看起来像“/categories/: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() {}
}
您不想订阅路由参数而不是查询参数吗? (即 activatedRoute.params.subscribe 而不是 activatedRoute.queryParams.subscribe)
我最终解决这个问题的方法是:
1) 创建一个使用 BehaviorSubject 接收参数更新的面包屑服务
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { BreadcrumbsList } from './breadcrumbsList';
import { ParseErrorLevel } from '@angular/compiler';
@Injectable({
providedIn: 'root'
})
//
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) 在面包屑组件中,让面包屑列表订阅来自 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
我正在尝试从看起来像“/categories/: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() {}
}
您不想订阅路由参数而不是查询参数吗? (即 activatedRoute.params.subscribe 而不是 activatedRoute.queryParams.subscribe)
我最终解决这个问题的方法是:
1) 创建一个使用 BehaviorSubject 接收参数更新的面包屑服务
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { BreadcrumbsList } from './breadcrumbsList';
import { ParseErrorLevel } from '@angular/compiler';
@Injectable({
providedIn: 'root'
})
//
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) 在面包屑组件中,让面包屑列表订阅来自 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