(Angular2/4)使用服务从一个组件向另一个组件发送数据

(Angular2/4)使用服务从一个组件向另一个组件发送数据,angular,Angular,我从Angular开始,在传输数据时遇到了问题。 基本上,我正在尝试将数据从我的表单获取到另一个组件。我希望能够访问接收组件中的每个元素(例如data.name)。以下是我的发件人(组件)代码: 您可以使用将在组件上提供的服务(除非您需要将作用域设置为所有应用程序,并且在这种情况下,您可以将其注入到应用程序的任何模块中) 我给您的建议是构建一个表示表单数据的接口,并构建该类型的变量。然后,您只需在表单submit上设置服务中的数据 这将是接口: export interface IFrmData

我从Angular开始,在传输数据时遇到了问题。 基本上,我正在尝试将数据从我的表单获取到另一个组件。我希望能够访问接收组件中的每个元素(例如data.name)。以下是我的发件人(组件)代码:


您可以使用将在组件上提供的服务(除非您需要将作用域设置为所有应用程序,并且在这种情况下,您可以将其注入到应用程序的任何模块中)

我给您的建议是构建一个表示表单数据的接口,并构建该类型的变量。然后,您只需在表单submit上设置服务中的数据

这将是接口:

export interface IFrmData{
name:string;
use:string;
year:number;
duration:number;
...
}
这是服务:

import {IFrmData} from './ifrdata.interface';
inport {Injectable} from '@angular/core';
Injectable()
export class FrmService{
idata:IFrmData;
setData(_data:IFrmData):void{
idata= Object.assign({},_data);
}
    }
现在,在表单组件中,您还创建了IFrmData类型的变量,并在onSubmit处设置其值:

constructor(private frmService:FrmService){}
    onSubmit(data) {
      this.name = data.name;
      this.use = data.use;
      this.year = data.year;
      this.duration = data.duration;
      this.milageVehicle = data.milageVehicle;
      this.milageYear = data.milageYear;
      this.passengerCoverage = data.passengerCoverage;
      this.postcode = data.postcode;
      this.towing = data.towing;
      this.vehicleLicensePlate = data.vehicleLicensePlate;
      this.frmService.setData(data);
}
从这一点来看,从ant其他组件获取数据非常容易,只要该组件具有该服务的DI


您可以使用对象作为观察者和可观察者来获取和设置数据。angular站点上有一个很好的文档:

您可以使用组件提供的服务(除非您需要范围是所有应用程序,在这种情况下,您可以将其插入应用程序的任何模块)

我给您的建议是构建一个表示表单数据的接口,并构建该类型的变量。然后,您只需在表单submit上设置服务中的数据

这将是接口:

export interface IFrmData{
name:string;
use:string;
year:number;
duration:number;
...
}
这是服务:

import {IFrmData} from './ifrdata.interface';
inport {Injectable} from '@angular/core';
Injectable()
export class FrmService{
idata:IFrmData;
setData(_data:IFrmData):void{
idata= Object.assign({},_data);
}
    }
现在,在表单组件中,您还创建了IFrmData类型的变量,并在onSubmit处设置其值:

constructor(private frmService:FrmService){}
    onSubmit(data) {
      this.name = data.name;
      this.use = data.use;
      this.year = data.year;
      this.duration = data.duration;
      this.milageVehicle = data.milageVehicle;
      this.milageYear = data.milageYear;
      this.passengerCoverage = data.passengerCoverage;
      this.postcode = data.postcode;
      this.towing = data.towing;
      this.vehicleLicensePlate = data.vehicleLicensePlate;
      this.frmService.setData(data);
}
从这一点来看,从ant其他组件获取数据非常容易,只要该组件具有该服务的DI


您可以使用对象作为观察者和可观察者来获取和设置数据。angular站点上有一个很棒的文档:

您可以通过使用BehaviorSubject实现这种类型的功能。当有来自第一个组件的数据时,您可以将该数据推送到
BehaviorSubject
,然后在第二个组件中订阅该数据,这样您就可以在从第一个组件推送数据后立即获得该数据。您可以在
userDataService
中执行类似操作

private userDataSubject: BehaviorSubject;
constructor() {
   this.userDataSubject = new BehaviorSubject(null);
}
pushData(data) {
  this.userDataSubject.next(data);
}
getData() {
  return this.userDataSubject.asObservable();
}
现在,在您发送数据的组件中,您可以执行以下操作:

onSubmit(data) {
  this.userDataService.pushData(data);
}
this.userDataService.getData().subscribe(
  data => {
   console.log(data);
}
)
在您接收数据的组件中,您可以像这样
订阅
以获取
数据

onSubmit(data) {
  this.userDataService.pushData(data);
}
this.userDataService.getData().subscribe(
  data => {
   console.log(data);
}
)

您可以通过使用BehaviorSubject实现这种类型的功能。当有来自第一个组件的数据时,您可以将该数据推送到
BehaviorSubject
,然后在第二个组件中订阅该数据,这样您就可以在从第一个组件推送数据后立即获得该数据。您可以在
userDataService
中执行类似操作

private userDataSubject: BehaviorSubject;
constructor() {
   this.userDataSubject = new BehaviorSubject(null);
}
pushData(data) {
  this.userDataSubject.next(data);
}
getData() {
  return this.userDataSubject.asObservable();
}
现在,在您发送数据的组件中,您可以执行以下操作:

onSubmit(data) {
  this.userDataService.pushData(data);
}
this.userDataService.getData().subscribe(
  data => {
   console.log(data);
}
)
在您接收数据的组件中,您可以像这样
订阅
以获取
数据

onSubmit(data) {
  this.userDataService.pushData(data);
}
this.userDataService.getData().subscribe(
  data => {
   console.log(data);
}
)

我能单独访问每个元素吗?这是一个汽车保险项目。基本上,我需要通过IF语句运行从表单中收集的值,以检查基本用户信息并返回最适合他们的保险计划。例如,如果用户驾驶超过x公里/年,则返回此计划…是的,当然可以,为了验证,您可以在第二个组件中看到数据的控制台结果,它将是一个对象,您可以访问其属性,如
车辆品牌
name
etcare您是否使用html或.ts文件中的值?在typescript文件中,您是否在
console.log(data)
之后在控制台中获取数据?我是否能够单独访问每个元素?这是一个汽车保险项目。基本上,我需要通过IF语句运行从表单中收集的值,以检查基本用户信息并返回最适合他们的保险计划。例如,如果用户驾驶超过x公里/年,则返回此计划…是的,当然可以,为了验证,您可以在第二个组件中看到数据的控制台结果,它将是一个对象,您可以访问其属性,如
车辆品牌
name
et是否使用html或.ts文件中的值?在typescript文件中,是否在
console.log(数据)
之后在控制台中获取数据?