如何将子组件数据传递给父组件

时间:2021-02-05 11:28:54

标签: javascript angular typescript

我有 3 个组件,2 个子组件和 1 个父组件。 我在父组件中有保存按钮,为了在父组件中获取子数据,我试过这个:

<div class="border border-dark p-1 m-1">
  <basic-details
    *ngIf="customerData"
    [formType]="formType"
    [customerDetails]="customerData"
    #customerDetails
  ></basic-details>
</div>
<div class="border border-dark p-1 m-1">
  <verification-details
    *ngIf="customerData"
    [formType]="formType"
    [customerDetailsForKyc]="customerData"
    #customerDetailsForKyc
  ></verification-details>
</div>

<div class="row main justify-content-center">
  <button class="btn btn-primary" (click)="save(customerDetails, customerDetailsForKyc)">Save</button>
  <button class="btn btn-primary ml-2" (click)="cancel()">Cancel</button>
</div>
<块引用>

ts 文件

save(basic, kyc) {
    console.log('basic', basic);
    console.log('kyc', kyc);
  }

对于 basic-details 组件,我在单击保存按钮时在父组件中获得了正确的数据,但是对于 verification-details 我收到以下错误:

在两个子组件中,我都使用@Input() 获取数据,如下所示:

<块引用>

对于基本组件:

@Input() customerDetails: ICustomerDetailsData;
<块引用>

用于验证组件

@Input() customerDetailsForKyc;

我做错了什么吗?

3 个答案:

答案 0 :(得分:1)

我有一个关于你的代码的工作示例,两个孩子和一个家长。正如您在问题中所描述的,我在我的代码中使用了几乎类似的东西。你没有提到[formType]="formType",这就是我没有使用它的原因。请检查我的代码。它适用于 StackBlitz ==> Angular two way data binding between parent and child co acqylp

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

@Component({
  selector: 'app-root',
  template: `<app-children [(data)]="message"  
              [customerDetails]="customerData"
              #customerDetails></app-children>
             <br><br>
             <app-children2 [(data)]="message2" 
              
             [customerDetailsForKyc]="customerData"
             #customerDetailsForKyc></app-children2>
            <div>Parent: {{message}}
            <br>
            <button class="btn btn-primary" (click)="save(customerDetails, customerDetailsForKyc)">Save</button>
            </div>`,
})

export class AppComponent {
  public message: string;
  public message2: string;
  customerData:ICustomerDetailsData={color:'TTT',width:15};
  ngOnInit() {
    this.message = 'Original message'
    this.message2 = 'Original message2'
  }
  save(basic, kyc) {
    console.log('basic', basic);
    console.log('kyc', kyc);
  }
}

@Component({
  selector: 'app-children',
  template: `<div>Children: {{data}}</div> 
              <br>
              <input type="text" class="form-control" id="name"
     
              [(ngModel)]="data" >
              <br>
             <a (click)="changeMessage('Children message')">Click me!</a>`
})

export class ChildComponent {
  @Input() public data: string;
  @Input() customerDetails: ICustomerDetailsData;
  @Output() dataChange= new EventEmitter<string>();
  changeMessage(message: string) {
    this.data = message;
    this.dataChange.emit(this.data);
  }
}

 @Component({
  selector: 'app-children2',
  template: `<div>Children: {{data}}</div> 
             <a (click)="changeMessage('Children message')">Click me!</a>`
})

export class ChildComponentNew {
    @Input() customerDetailsForKyc;
  @Input() public data: string;
  @Output() dataChange= new EventEmitter<string>();
  changeMessage(message: string) {
    this.data = message;
    this.dataChange.emit(this.data);
  }
}
interface ICustomerDetailsData {
  color?: string;
  width?: number;
}

答案 1 :(得分:0)

原文

  1. 您的方法:this.setState(prevState => newState) 使用模板变量作为参数。这是错误的,因为他们有其他目标。 “模板变量可帮助您在模板的另一部分使用模板一部分中的数据。通过模板变量,您可以执行诸如响应用户输入或微调应用程序表单等任务。” Template variables | Angular
  2. 如果要在父组件中发送数据(将子组件数据传递给父组件),请使用装饰器@Output Sharing data between child and parent directives and components | Angular

答案 2 :(得分:0)

从子组件到父组件获取数据的另一种选择是使用@ViewChild 装饰器将子组件注入父组件。因此,当单击保存按钮时,您应该能够获取子组件的数据。检查ViewChild | Angular