Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Angular 6服务中获取当前路由参数的最佳方法是什么?_Angular_Typescript_Angular Routing - Fatal编程技术网

在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

我试图找出在Angular 6中获取当前路由参数的最佳方法

目前,我必须将
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'])