使用角度(2 + 直到最新)从 URL 中提取 id

嗨,我正在尝试提取的 ID 部分的 URL 使用 Angular2。

http://localhost:3000/item/187809

我一直在 onInit中使用 ActiveRoute,但是没有运气

     this.route.queryParams.forEach((params: any) => {
console.log("QUERYPARAMS");
console.log(params);
});

还尝试订阅这样的路由更改

    this.routeSub = this.route.queryParams.subscribe(params => {
console.log(params);
console.log(+params['id']);
});

但是 params只是一个空对象。

我把路线定义为像这样的懒散路线

    {
path: item',
children: [
{ path: ':id', loadChildren: './item/item.module#ItemModule'},
]
},

我认为问题在于我有一个头部组件和一个主组件,它保存延迟加载的路由子组件。我试图在头部组件中加载 id。

知道少了什么吗?

106970 次浏览

I suspect the issue is that you're using queryParams instead of just params.

params: An Observable that contains the required and optional parameters specific to the route.

queryParams: An Observable that contains the query parameters available to all routes.

so try this:

    this.route.params.subscribe(params => {
console.log(params);
console.log(+params['id']);
});
    this.routeSub = this.route.params.subscribe(params => {
console.log(params);
console.log(+params['id']);
});

Subscribing and Unsubscribing to Route Parameters

  1. Make sure you have configured a route that expects a parameter like so:
{path: 'item/:id', component: SomeItemComponent}
  1. Declare a variable for your route subscription. Import ActivatedRoute (not ActiveRoute) and inject it in your component constructor.
private routeSub: Subscription;
constructor(private route: ActivatedRoute) { }
  1. Inside ngOnInit in the same component, you can access the data in the params observable by subscribing to it like so:
ngOnInit() {
this.routeSub = this.route.params.subscribe(params => {
console.log(params) //log the entire params object
console.log(params['id']) //log the value of id
});
}
  1. Inside ngOnDestroy, unsubscribe to prevent memory leaks.
ngOnDestroy() {
this.routeSub.unsubscribe();
}

Update - January 2021

There is a big difference between route.params and route.queryParams.

route.params, when subscribed to, returns an object with keys (that come from your route parameters, see step 1) and string values that are provided when navigating to the route. For example:

example.com/item/1

{
itemId: '1'
}

route.queryParams, when subscribed to, returns an object with keys and string values that come from the query string (wiki) in the URL. For example:

example.com/welcome?var1=abc&var2=cde

{
var1: 'abc',
var2: 'cde'
}

route.queryParams will be undefined if a query string is not present in the URL. I believe OP, and some users in the comments have mistakenly used this instead of route.params.

I know I'm a bit late with a reply, but just in case you were still having problem please take a look at the Angular documentation.

angular routing tutorial

Look at the example from the link.

Start by importing ActivatedRoute:

    import { ActivatedRoute } from '@angular/router';

Then inject it in the constructor

    constructor(private route: ActivatedRoute) {}

And in OnInit()

    ngOnInit(): void {
const id = this.route.snapshot.paramMap.get('id');
}

and like this you don't need to worry about any Observables directly.

Hope this helps you.

You have multi options to get id

    constructor(private route: ActivatedRoute) { }

1-With the help of params

    const id= this.route.snapshot.params['id'];

or

    const id = this.route.snapshot.params.id // any param name after "params"

2-With the help of paramMap

    const id= this.route.snapshot.paramMap.get('id')

3-subscribe to params (do not forget to unsubscribe)

      private subscription: Subscription


constructor(private route: ActivatedRoute) { }
ngOnInit(): void {
this.subscription = this.route.params.subscribe(params => {
const id = params['id']
})
}


//To prevent memory leak
ngOnDestroy(): void {
if (this.subscription)
this.subscription.unsubscribe()
}


UPDATED

Imagine, you have the following route:
    {
path: "",
component: LayoutComponent,
children: [
{
path: "action/:id", component: ChildComponent
}
]
}

If you are in the LayoutComponent and you want to get params of ChildComponent you have to use the following way:

    this.route.children.forEach(child => {
child.params.subscribe(params => {
const id = params['id']
})
}

I have faced the same problem while working with Angular 8, and solved it by:

  1. At first, import ActivatedRoute:
    import { ActivatedRoute } from '@angular/router';
  1. Then, Inject ActivatedRoute in the constructor:
    constructor(private activatedRoute: ActivatedRoute) {}
  1. Your ngOnit method will look like this.
    ngOnInit(){
const id = this.activatedRoute.snapshot.paramMap.get('id');
}

I found it from the official documentation of Angular.