在Angular 6服务中获取当前路由参数的最佳方法是什么?
我试图找出在Angular 6中获取当前路由参数的最佳方法 目前,我必须将在Angular 6服务中获取当前路由参数的最佳方法是什么?,angular,typescript,angular-routing,Angular,Typescript,Angular Routing,我试图找出在Angular 6中获取当前路由参数的最佳方法 目前,我必须将ActivatedRoute作为参数传递给服务的方法,然后在服务中使用它 export class MainComponent { constructor(private dataService: DataService, private activeRoute: ActivatedRoute) { } getChartsData() { return this.dataService(t
ActivatedRoute
作为参数传递给服务的方法,然后在服务中使用它
export class MainComponent {
constructor(private dataService: DataService, private activeRoute: ActivatedRoute) { }
getChartsData() {
return this.dataService(this.activeRoute);
}
}
@Injectable({
providedIn: "root"
})
export class DataService {
getChartsData(activatedRoute) {
if (activatedRoute.snapshot.params['id']) {
...
} else {
...
}
}
}
在大多数情况下,服务不应访问路由。“ChartDataService”应该加载并返回由某些东西(例如id)标识的图表。请记住:如果直接在服务中访问当前路由,则绝对不能更改参数名称,因为这会中断数据服务
export class ChartDataService {
getChart(id: string) { … }
}
// in your component
const chartId = // read from activated route
this.chartsService.getChart(chartId);
如果您确实希望访问服务中的当前路由,则不能注入ActivatedRoute(这是设计的,请参见示例)。但您可以插入路由器本身并侦听导航事件:
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
例如
文档:由于您需要当前路由参数,而不是
activatedRoute.snapshot
,因此您应该订阅activatedRoute.params
。它将为您提供当前路由参数的最新更新值
您的服务方法不应负责从ActivatedRoute
获取id
。这应该是您的组件的责任。您的服务应该只负责从组件
获取id
,然后根据该id
执行所需操作
您应该从组件中的activatedRoute
提取id。然后通过传递id
export class MainComponent {
constructor(
private dataService: DataService,
private activeRoute: ActivatedRoute
) { }
getChartsData() {
this.activeRoute.params.subscribe(params => {
if(params['id']) {
this.dataService.getChartsData(params['id'])
.subscribe(data => console.log(data));
}
})
}
}
为你效劳
@Injectable({
providedIn: "root"
})
export class DataService {
getChartsData(id) {
if (id) {
...
} else {
...
}
}
}
你不能在服务中注入ActivatedRoute
吗?这实际上取决于路由器树的结构。此服务在根目录下注入意味着它只会看到根目录下的路由器参数,而不会看到子参数。@ritaj我正在这样做,但当我尝试获取当前路由参数时,得到的是空对象。使用snapshot.params
仅适用于组件首次加载时。你所追求的是订阅可观察的this.activatedRoute.params
。因此它将类似于:this.activatedRoute.params.subscribe((params:params)=>console.log(params['id'])