Angular 7/8 - 如何在应用程序组件中获取 url 参数

Posted

技术标签:

【中文标题】Angular 7/8 - 如何在应用程序组件中获取 url 参数【英文标题】:Angular 7/8 - How to get url parameters in app component 【发布时间】:2020-04-24 13:49:39 【问题描述】:

我有单点登录,但为了测试,我想从 url localhost:4200/?id=test&name=testing&email=testing@test.com 读取值并将它们传递给应用程序组件中的 API。

会有一个标志,在此基础上我将从 url 读取而不是使用单点登录功能

if (url_enabled == true) 
    getParamsFromUrl()
  else 
   singleSignOn()
 

我尝试了 ActivatedRoute,但它似乎不起作用。

我已经尝试过queryParams, params, url, queryParamsMap,但这些似乎都不起作用。我得到的只是空值。

应用组件内部

app.component.ts

 getParamsFromUrl() 
    this._router.events.subscribe((e) => 
      if (e instanceof NavigationEnd) 
        console.log(e.url)
      
    )
  

 this.route.queryParams.subscribe(params => 
      console.log(params);
    )

app.component.html

<router-outlet></router-outlet>

app-routing.module.ts

const routes: Routes = [
  path:'*/:id', component: AppComponent,
];

我已经尝试了在 *** 或其他博客上找到的所有内容。有人可以指出我在这里缺少什么吗?

【问题讨论】:

【参考方案1】:

你可以这样试试

constructor(
  private activatedRoute: ActivatedRoute
)

ngOnInit() 
  this.activatedRoute.paramMap
            .pipe(
               tap(console.log(this.activatedRoute.snapshot.paramMap.get(
                        "id"
                   )))
             ).subscribe()

如果您需要任何帮助,请告诉我

【讨论】:

【参考方案2】:

Angular 为我们提供了 ActivatedRoute 对象。我们可以以与上面相同的方式访问 URL 参数值,几乎没有区别。这种类型的数据可以通过两种不同的方式访问。一种是通过 route.snapshot.paramMap,另一种是通过 route.paramMap.subscribe。两者的主要区别在于订阅会随着特定路由的参数变化而不断更新。

ngOnInit() 
    this.route.paramMap.subscribe(params => 
        this.userType = params.get("userType")
    )

【讨论】:

【参考方案3】:

对于这条路线: 你可以试试这个方法:

const routes: Routes = [
   path:'*/:id', component: AppComponent,
];   

在 AppComponent .ts 文件中:

    constructor(
      private activatedRoute: ActivatedRoute,
    )  




    ngOnInit() 
      this.activatedRoute.params.subscribe(params => 
          const id = params['id'];
          console.log('Url Id: ',id);
    

    OR

    ngOnInit() 
      this.activatedRoute.queryParams.subscribe(params => 
          const id = +params.id;
          if (id && id > 0) 
           console.log(id);
          
      );
    
  
  

【讨论】:

似乎没有任何效果,因为我试图在父组件中获取查询参数。【参考方案4】:

您需要创建一个新组件并更新路由配置,如下所示:

首先,新建一个组件:MainComponent:

import  Component  from '@angular/core';

@Component(
  selector: 'main',
  template: `<router-outlet></router-outlet>`,
)
export class MainComponent 
  constructor()   

然后,更新您的AppModule

import  AppComponent  from './app.component';
import  MainComponent  from './main.component';

@NgModule(
  imports:      [ 
    BrowserModule, 
    FormsModule,
    RouterModule.forRoot([
      path: '', component: AppComponent
    ])
  ],
  declarations: [ MainComponent, AppComponent ],
  bootstrap:    [ MainComponent ]
)
export class AppModule  

最后,您需要更新您的index.html 文件(确保加载全新的组件而不是AppComponent):

<main>loading</main>

现在您可以按照AppComponent 中的要求读取参数:

import  Component, OnInit  from '@angular/core';
import  ActivatedRoute, Params  from '@angular/router';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
)
export class AppComponent implements OnInit 
  params: Params;

  constructor(private route: ActivatedRoute)

  ngOnInit() 
      this.route.queryParams.subscribe((params: Params) => 
        this.params = params;
        console.log('App params', params);
        const id = params['id'];
        console.log('id', id);
      );
  

在此处查看一个工作示例:https://read-params-app-component.stackblitz.io/?id=test&name=testing&email=testing@test.com。

并找到源代码here。

希望对你有帮助!

【讨论】:

【参考方案5】:

我在 Angular 8 中使用了 jquery,并在应用组件中声明它后使用 jquery $ 变量获取了 href。

import  query  from '@angular/animations';

declare var $: any;

【讨论】:

【参考方案6】:

首先有一个像你这样的带有 queryParams 的 url:

localhost:4200/?id=test&name=testing&email=testing@test.com

通过这种方式,您可以使用 ActivatedRoute 对象访问查询参数:

 this.name = this.activatedRoute.snapshot.queryParamMap.get('name'); // this.name = 'testing'

或者:

 this.activatedRoute.queryParams.subscribe(params => 
       this.name= params['name'];
     );

另一种方式是

localhost:4200/test/testing/testing@test.com

您用于同步检索(一次):

this.name = this.activatedRoute.snapshot.ParamMap.get('name');

【讨论】:

【参考方案7】:

使用来自@uirouter/coreTransition 可以很容易地从url 获取参数。

import Transition from '@uirouter/core';

@Component()
export class MyComponent 
public myParam = this.transition.params().myParam;

public constructor(public transition: Transition) 

【讨论】:

以上是关于Angular 7/8 - 如何在应用程序组件中获取 url 参数的主要内容,如果未能解决你的问题,请参考以下文章

Angular - 如何在组件级别实现异常处理

Android GridView 焦点顺序

如何仅在 Angular 的一个组件中使用 Bootstrap?

如何在Angular 4中将值从子组件传递到父组件

如何在Angular中的路由之间推送数据[重复]

如何在 Angular 组件中隐藏默认浏览器滚动条?