繁体   English   中英

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

[英]How to pass child component data into parent

我有 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;

我做错了什么吗?

我有一个您的代码的工作示例,两个孩子和一个父母。 正如您在问题中所描述的,我在代码中使用了几乎类似的东西。 您没有提到[formType]="formType" ,这就是我没有使用它的原因。 请检查我的代码。 它在 StackBlitz 中工作 ==> Angular 父子 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. 您的方法: save(customerDetails, customerDetailsForKyc)"用作 arguments 模板变量。这是错误的,因为它们有其他目标。"模板变量帮助您在模板的另一部分使用来自模板一部分的数据。 使用模板变量,您可以执行诸如响应用户输入或微调应用程序的 forms 等任务。”模板变量 | Angular
  2. 如果要在父组件中发送数据(将子组件数据传递给父组件),那么使用装饰器 @Output在子和父指令和组件之间共享数据 | Angular

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM