Angular中的组件通信

来自菜鸟教程
跳转至:导航、​搜索

介绍

在这篇文章中,您将了解在 Angular 中的组件之间传递数据的三种方法,根据具体情况,哪种方法是最好的方法。

1. 从 URL 传递数据

考虑一下我们正在从一个页面导航到另一个页面,其中前一页被破坏并且我们正在登陆另一个页面。 如果要传递的数据不多(例如,对象的 id),我们可以使用 URL 来传递数据。

在 Angular 中有两种通过 URL 传递数据的方法:

  • 路由器参数
  • 查询参数

如果该参数对于组件是必需的,那么我们必须使用路由器参数。 否则,我们可以使用 查询参数

使用路由器参数

路由器参数是必需参数。 我们必须在路由器模块中使用 URL 注册参数,如下所示:

应用路由器.module.ts

const routes: Routes = [
  { path: 'list/:id', component: AppListComponent }
];

在此示例中,list 是路由 URL,:id 是必须通过的路由器参数,AppListComponent 是要安装在该路由上的组件。

通过 routerLink 指令传递路由器参数

<button
  type="button" 
  [routerLink]="['/list', id]"
>
  Show List
</button>

在此示例中,id 是在该组件的代码中初始化的变量,而 /list 是我们要导航的路线。

通过 route 服务传递路由器参数

app.component.ts

id = 28;

constructor (private router: Router) {}

route() {
  this.router.navigate(['/list', this.id]);
}

读取路由器参数

以下是如何从路由到的组件中读取路由器参数:

应用程序列表.component.ts

constructor(
  private activatedroute: ActivatedRoute
) {
  this.activatedroute.params.subscribe(data => {
    console.log(data);
  })
}

使用查询参数

查询参数是可选参数。 无需为查询参数注册单独的 URL。

应用路由器.module.ts

const routes: Routes = [
  { path: 'list', component: AppListComponent }
];

在此示例中,list 是路由 URL,AppListComponent 是组件。

通过 routerLink 指令传递查询参数

<button
  type="button"
  [routerLink]="['/list']"
  [queryParams]="{id: '24'}"
>
  Show List
</button>

在此示例中,id 是键,24 是静态值。 您还可以通过变量传递动态值。

通过 route 服务传递查询参数

app.component.ts

id = 28;

constructor (private router: Router) {}

route() {
  this.router.navigate(['/list'], {queryParams: {id: this.id}});
}

读取查询参数

应用程序列表.component.ts

constructor(
  private activatedroute: ActivatedRoute
) {
  this.activatedroute.queryParams.subscribe(data => {
    console.log(data);
  })
}

注意:在本文中获取有关Angular路由器参数的更多详细信息。


2. 通过 @Input@Output 传递数据

如果我们想将数据从子组件传递给父组件或父组件到子组件,我们可以使用 @Input@Output

应用程序-parent.component.html

<app-child
  [jsonData]="data"
  (outputData)="data = $event"
></app-child>

这里 data 是在组件代码中初始化的变量。

app-child.component.ts

import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'app-child',
  template: ''
})
export class AppChild implements OnInit {
  @Input() 
  jsonData;
  @Output()
  outputData = new EventEmitter();
  constructor() {}

  ngOnInit() {
    console.log(this.jsonData);
  }

  emitData(data) {
    this.outputData(data);
  }
}

通过这种方式,我们可以将数据从孩子传递给父母,也可以从父母传递给孩子。

注意; 在本文 中获取有关@Input() 的更多详细信息,在本文 中获取有关@Output() 的更多详细信息。


3. 使用 Observables 通过服务传递数据

如果两个组件是同级的,或者层次结构中组件的级别更远,那么最好使用服务来使用 observables 传递数据。

这个例子使用 RxJS subject 创建一个 observable:

应用服务.ts

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable({providedIn: 'root'})
export class AppService {
  observer = new Subject();
  public subscriber$ = this.observer.asObservable();

  emitData(data) {
    this.observer.next(data);
  }
}

要发出数据,您可以调用此服务的 emitData 方法并获取数据,您必须像这样订阅 subsciber$

constructor(private appService: AppService) {}

ngOnInit() {
  this.appService.subscriber$.subscribe(data => {
    console.log(data);
  });
}

结论

现在就是这样,三种在 Angular 中的组件之间来回传递数据的方法。 现在继续构建一些很棒的组件!