Angular 2 - 如何传递 URL 参数?

IT技术 javascript node.js angular npm
2021-02-20 09:00:51

我在 Angular 2 中创建了一个单页抵押计算器应用程序,它对我来说就像一个学习游乐场(试图更加习惯目前在工作中使用的技术堆栈)......它在http://www.mortgagecalculator123.com上运行如果你想看的话。如果您想查看它,我已经在页面上通过 Fork Me 链接将其开源。

无论如何,我想要做的是能够直接从 URL 将变量传递给我的应用程序,以便我的 Angular 2 应用程序可以使用它们。像这样:http : //www.mortgagecalculator123.com/? var1=ABC&var2 =DEF

我试过,在我的 app.component.ts 中,我添加了以下内容:

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

AppComponent {
private var1: string;
private var2: string;

constructor(
  private route: ActivatedRoute,
  private router: Router
  ) {}

ngOnInit() {
  this.route.params.forEach((params: Params) => {
      this.var1 = params['var1'];
      this.var2 = params['var2'];
  });

  console.log(this.var1, this.var2);
}
...
}

但这不起作用,当我运行npm start 时,出现以下错误:

aot/app/app.component.ngfactory.ts(45,30): 错误 TS2346: 提供的参数与调用目标的任何签名都不匹配。

在此处输入图片说明

谢谢,任何帮助将不胜感激。

2个回答

我创建了一个带有查询参数工作的拉取请求。我会尽力解释我所做的一切。

之前的答案不起作用的原因是因为您根本没有使用路由器。您创建了一个没有路由的大型应用程序组件。为了解决这个问题,我们需要开始使用 route module,我还建议您阅读这两个教程:RoutingRouting & Navigation

首先,我们需要更改您的index.html,将其添加到您的<head>

<base href="/">

这里为什么要补充一点,这一点很重要。

然后,由于您正在使用您的AppComponent来显示我们创建一个新组件所需的一切,我们将称之为RootComponent. 在您index.html更改<my-app><root>; 它看起来像这样:

<root>Loading...</root>

现在在您的app文件夹中,我们需要创建两个文件,第一个文件root.component.ts如下所示:

import { Component } from '@angular/core';

@Component({
  selector: 'root',
  template: `<router-outlet></router-outlet>`,
})
export class RootComponent {
  constructor() {  }
}

看我们有<router-outlet></router-outlet>一个模板,Angular 将根据路由注入我们的组件。

我们还需要再创建一个文件,它是main.route.ts,它是这样的:

import { Routes, RouterModule }   from '@angular/router';
import { AppComponent } from './app.component';

export const mainRoutes: Routes = [
  { path: '', component: AppComponent }
];
export const mainRoutingProviders: any[] = [];
export const routing = RouterModule.forRoot(mainRoutes);

在这个文件中,我们说对于我们的基本路线,我们想要渲染我们的 AppComponent

我们已经创建了我们的新文件,现在我们需要告诉我们的App Module关于它们,app.module.ts所以我们导入新文件并声明新组件。我们还需要更改我们的 boostrap 组件:

import {NgModule}      from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
import {AppComponent}  from './app.component';
import {RootComponent}  from './root.component'; // we import our new RootComponent
import {ChartModule} from 'primeng/primeng';
import {TooltipModule} from 'primeng/primeng';
import { routing, mainRoutingProviders } from './main.routes'; // We also import our Routes

@NgModule({
  imports: [
    BrowserModule,
    ChartModule,
    FormsModule,
    mainRoutingProviders, // we also need to import our route provider into the module
    ReactiveFormsModule,
    routing, // and also import our routes declarations
    TooltipModule
  ],
  declarations: [AppComponent, RootComponent], // we declare our new RootCpmponent
  bootstrap: [RootComponent] // Notice that we are now using our RootComponent to bootstrap our app
})
export class AppModule {
}

现在,这一切的地方,我们现在终于可以开始参数传递到我们的应用程序,你的AppComponent进口RouterActivatedRouteParams@angular/router让你AppComponent看起来是这样的:

import { Component, OnDestroy, OnInit } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';

export class AppComponent implements OnInit, OnDestroy {
  private var1: string;
  private var2: string;
  private sub: Subscription;

  constructor(
    private route: ActivatedRoute,
    private router: Router
  ) {}

  ngOnInit() {
    // assign the subscription to a variable so we can unsubscribe to prevent memory leaks
    this.sub = this.route.queryParams.subscribe((params: Params) => {
      this.var1 = params['var1'];
      this.var2 = params['var2'];
      console.log(this.var1, this.var2);
    });
  }

  ngOnDestroy() {
    this.sub.unsubscribe();
  }
...
}

你可以在这里看到拉取请求

解决了,谢谢。问题是我正在定义一个 Route 并path: ''重定向到我的具有 path 的组件mycomponent如果我启动,http:\\myapp\?myVar=AAA我不会得到任何变量。但是如果我启动,http:\\myapp\mycomponent?myVar=AAA我可以从 url 中检索参数。
2021-04-17 09:00:51
这非常有帮助。请注意,Angular 不鼓励使用queryParams,您应该queryParamMap改用。您可以使用angular.io/guide/router#activated-route访问参数params['params']['var1']
2021-04-17 09:00:51
是的,你不需要那个。除非您最终计划重定向到某个路线。
2021-04-27 09:00:51
还有一个问题.... 在 app.component.ts 中,是否需要保留:'private router: Router',在第 65 行?看起来这是一个未使用的参数,不是吗?
2021-05-03 09:00:51
法比奥,这正是我一直试图弄清楚的。太感谢了。当谈到 Angular 2 时,我仍然是一个新手,所以非常感谢您花费宝贵的时间来解释一切。它不仅现在有效,而且按照您概述的逻辑进行了很好的学习练习。50 分的声誉当之无愧。
2021-05-05 09:00:51

看来您正在处理Queryparams所以要访问它们,您可以尝试以下代码,

this.var1= this.route
      .queryParams
      .map(params => params['var1']);
当我这样做时,我收到以下错误: aot/app/app.component.ngfactory.ts(45,30): error TS2346: Supplied parameters do not match any signature of call target。app/app.component.ts(90,39): 错误 TS2339: 属性 'map' 不存在于类型 'Observable<{ [key: string]: any; }>'。
2021-04-22 09:00:51
感谢您的尝试,希望其他人可以提供帮助。
2021-04-30 09:00:51
仅供参考,queryParams已被替换为queryParamsMap. 来源
2021-04-30 09:00:51
我尝试使用: import 'rxjs/add/operator/map'; 但后来我又回到了原来的错误 TS2346: 提供的参数与调用目标的任何签名都不匹配。太疯狂了,像传递变量这样简单的事情竟然如此复杂......
2021-05-01 09:00:51