如何从角度4的URL中获取参数?


77

我正在尝试从URL获取开始日期。网址看起来像http://sitename/booking?startdate=28-08-2017

我的代码如下:

aap.module.ts

    import {...};

    @NgModule({
      declarations: [
        AppComponent, ModalComponent
      ],
      imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        JsonpModule,
        ReactiveFormsModule,
        RouterModule.forRoot([{
                path: '',
                component: AppComponent
            },
        ]),    
      ], 
      providers: [ContactService, AddonService, MainService],
      bootstrap: [AppComponent]
    })
    export class AppModule { }

aap.component.ts

import {...}
import {Router, ActivatedRoute, Params} from '@angular/router';

constructor(private activatedRoute: ActivatedRoute) {
  // subscribe to router event
  this.activatedRoute.queryParams.subscribe((params: Params) => {
    console.log(params);
  });

}

但是它给下面的错误

不加承诺的拒绝:未设置基本href。请提供APP_BASE_HREF令牌的值,或将基本元素添加到文档中。; 区域:任务:Promise.then; 值:错误:未设置基本href。请提供APP_BASE_HREF令牌的值,或将基本元素添加到文档中。

Angular如何知道基本href?


Answers:


128

这应该可以从网址中检索参数:

constructor(private activatedRoute: ActivatedRoute) {
  this.activatedRoute.queryParams.subscribe(params => {
        let date = params['startdate'];
        console.log(date); // Print the parameter to the console. 
    });
}

现在,本地变量date应该包含URL中的startdate参数。可以删除Router和Params模块(如果未在该类的其他地方使用)。


这个答案是可行的,但是为什么刷新具有url参数的页面后会使页面空白?
Fai Zal Dong

很难说。我想到的第一件事是,您可能正在导航打字稿代码的ngOnInit部分,而没有提供任何参数?然后,它将自然返回没有任何参数的组件。
与Orjan

您好@Curiosity_is_Learning我正在尝试将查询参数设置为全局变量。当前具有这种逻辑的“日期”仅在此订阅方法中可用吗?如何将那些查询参数值保留为全局变量。我尝试了let.date = ['startdate'],但是在subscription方法之外的任何地方调用它时,它都未定义。
杰西

嗨,@ Jesse,这应该很简单。刚刚宣布在你这样的Anulgar组件的顶部的变量:private startDate: string;那么你应该能够取代let date = params['startdate'];this.startDate = params['startdate'];。然后你就可以在组件尽可能多的其他地方重用的变量,只要你喜欢,只需调用this.startDate
与Orjan

@Curiosity_is_Learning正是我所做的,但是一旦我在subscription方法之外调用“ this.startDate”。该值是不确定的。在订阅方法“ this.startDate”内部,打印出正确的日期。
杰西

152

路线

export const MyRoutes: Routes = [
    { path: '/items/:id', component: MyComponent }
]

零件

import { ActivatedRoute } from '@angular/router';
public id: string;

constructor(private route: ActivatedRoute) {}

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

13
在我看来,这个答案比公认的答案更好。谢谢!

如果我要发送一个对象并且不想在url中显示该对象,那我能做什么?
Anuj

@Anuj使用服务
Dmitry Grinko

我的要求不是这样,我想单击一个表并将该表数据发送到具有4-5个字段的另一页。
Anuj

1
@Anuj是的,您可以使用服务。onClick(row:any){this.shareService.setData(row); this.router.navigate(['/ page2'])},在您的page2中,您可以获取此数据ngOnInit(){const data = this.shareService.getData(); }希望对您
有所

19
constructor(private activatedRoute: ActivatedRoute) {
}

ngOnInit() {
    this.activatedRoute.params.subscribe(paramsId => {
        this.id = paramsId.id;
    });
    console.log(this.id);

 }

4
在我看来,这是对角度5的最佳答案。谢谢!
合并

1
无法在控制台中未定义的下一事件循环框架上解决可观察到的问题吗?
vp_arth

这给了我“不确定”
莎拉

这也给我“未定义”。由于某种原因,我怀疑此问题正在“ ngOnInit”上发生。当我创造了另一个方法和执行(执行console.log(this.id)我能够看到正确的数据,但具有的console.log正是你有它在你的答案;我收到的控制台未定义。
杰西

11

在角度上,他们将其分为2种网址。

  1. 网址格式/heroes/:limit。例:/heroes/20

    • 您可以使用获得原始价值route.snapshot.paramMap.get
    • 订阅route.paramMap以获取参数
  2. 网址格式/heroes。例:/heroes?limit=20

    • 您可以通过使用获得原始价值 route.snapshot.queryParamMap

参考:您需要了解的有关Angular参数的所有信息


7

可接受的答案使用可观察到的参数来检索该参数,该参数在整个组件生命周期中都会改变,这很有用。

如果该参数不变,则可以考虑在路由器URL快照上使用params对象。

snapshot.params 返回对象中URL中的所有参数。

constructor(private route: ActivateRoute){}

ngOnInit() {
   const allParams = this.route.snapshot.params // allParams is an object
   const param1 = allParams.param1 // retrieve the parameter "param1"
}

4

从URL字符串或:param在routeConfig中检查参数

下游组件

...
import {Router,ActivatedRoute} from '@angular/router';
...    
export class DownstreamComponent  {
    constructor(
    private route: ActivatedRoute,
    private router: Router
) {
    if(this.route.snapshot.queryParams) 
      console.log(this.route.snapshot.params); // e.g. :param1 in routeConfig
    if(this.route.snapshot.queryParamMap.get('param1'))
      console.log(this.route.snapshot.queryParamMap.get('param1')); // e.g. in URI ?param1=blah
}

}

3

您可以尝试以下方法:

this.activatedRoute.paramMap.subscribe(x => {
    let id = x.get('id');
    console.log(id);  
});

2

使用 paramMap

这将提供参数名称及其值

//http://localhost:4200/categories/1
//{ path: 'categories/:category', component: CategoryComponent },

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

constructor(private route: ActivatedRoute) { }

ngOnInit() {

  this.route.paramMap.subscribe(params => {
        console.log(params)
  })
}

2
import {Router, ActivatedRoute, Params} from '@angular/router';

constructor(private activatedRoute: ActivatedRoute) { }

  ngOnInit() {
    this.activatedRoute.paramMap
    .subscribe( params => {
    let id = +params.get('id');
    console.log('id' + id);
    console.log(params);


id12
ParamsAsMap {params: {…}}
keys: Array(1)
0: "id"
length: 1
__proto__: Array(0)
params:
id: "12"
__proto__: Object
__proto__: Object
        }
        )

      }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.