javascript - 将数据从子组件发送到父组件

标签 javascript angular output angular2-forms

我的子组件上有一个按钮,应该将信息发送到其父组件,但该按钮没有发送此信息。我可能遗漏了一些东西,但我仍然没有注意到。

这是我的子组件内按钮的代码(有两个按钮:selectPessoaJuridicaselectPessoaFisica:

import { Component, Input, Output, EventEmitter} from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormArray, FormsModule, ReactiveFormsModule} from '@angular/forms';
import {FinalizaDisputaService} from '../services/finaliza-disputa.service';
import {FinalizaDisputaComponent} from './finaliza-disputa.component'

@Component({
    moduleId: module.id,
    selector: 'titular',
    templateUrl: 'dados-titular.component.html'
})
export class TitularComponent {
    // we will pass in address from App component
  @Input('group')
  public titularForm: FormGroup;
  @Input() submitted:any;
  @Input() indexNumber:any;
  @Output() modelChanged = new EventEmitter<boolean>();
  public isJuridica = false;
  classe = {
    pessoa_fisica: 'selected',
    pessoa_juridica: ''
  };
  
  constructor(private _fb: FormBuilder, private finalizaAcordo:FinalizaDisputaService) {} 
   
  selectPessoaFisica(e:boolean){
    e = false;
    this.classe.pessoa_fisica = "selected";
    this.isJuridica = false;
    this.classe.pessoa_juridica = "";
    this.modelChanged.emit(e)
  }

  selectPessoaJuridica(e:boolean){
    e = true;
    this.classe.pessoa_fisica = "";
    this.classe.pessoa_juridica = "selected";
    this.isJuridica = true;
    console.log("ativou", e)
    this.modelChanged.emit(e);
  }
}

因此,这应该做的是通知父级 e 现在为 false。

这是父组件的 html:

<titular (modelChanged)="recebeValidators($event)" [indexNumber]="indice" [submitted]="submitted" [group]="formDadosBancarios.controls.dados_titular.controls[i]"></titular>

这是来自父组件的代码,我应该从 e (recebeValidators ) 接收值:

import { Component, OnChanges, OnInit, Input } from '@angular/core';
import { Http } from '@angular/http';
import { FormBuilder, FormGroup, Validators, FormArray, FormsModule, ReactiveFormsModule, AbstractControl, ValidatorFn } from '@angular/forms';
import { FinalizaDisputaService } from '../services/finaliza-disputa.service';
import {DisputaService} from '../../disputas/services/disputas.service';
import { dadosAcordo } from '../model/dados-acordo.interface';
import { TitularComponent } from './dados-titular.component';
import {Routes, RouterModule, Router, ActivatedRoute} from '@angular/router';

@Component({
  moduleId: module.id,
  selector: 'detalhes',
  templateUrl: `finaliza-disputa.component.html`,
  providers: [FinalizaDisputaService]
})

export class FinalizaDisputaComponent implements OnInit {
  public dados: dadosAcordo;
  disputa:any;
  public formDadosBancarios: FormGroup;
  public submitted: boolean;
  public events: any[] = [];
  public servError: any;
  public indice = 0;
  public loading = false;
  soma = 0;
  public servSuccess: any;
  @Input() e:boolean;
  cpf_REGEXP = /^\d+$/;

  constructor(private _fb: FormBuilder, private service:DisputaService, private finalizaAcordo: FinalizaDisputaService,
   private route:ActivatedRoute, private router:Router) {}

  ngOnInit() {
    this.route.params.subscribe(params => {
      let id = params['id'];
      this.service
        .buscaPorId(id)
        .subscribe(disputa => {
          this.disputa = disputa;
          console.log(disputa.campanha);
          console.log(this.disputa.propostas_realizadas);
        },
        erro => console.log(erro));
    })

    this.formDadosBancarios = this._fb.group({
      id: [''],
      termos_condicoes: [false, Validators.requiredTrue],
      dados_titular: this._fb.array([
        this.initTitular()
      ])
    })
  }
  /**
  * initTitular- Inicializa o grupo de formulário dinâmico e suas validações
  * @returns  ''
  */
  initTitular() {
    return this._fb.group({
      titular: ['', [<any>Validators.required, <any>Validators.minLength(3)]],
      cnpj: [''],
      cpf: ['', <any>Validators.required],
      data_nasc: ['', <any>Validators.required],
      agencia: ['', <any>Validators.required],
      banco: ['', <any>Validators.required],
      conta: ['', <any>Validators.required],
      tipo: ['', <any>Validators.required],
      pessoa_juridica: [false],
      valor_deposito: ['']
    })
  }
  // this is where I receive e

  recebeValidators(model: dadosAcordo, e: any) {
    console.log("test", e);
    const array = <FormArray>this.formDadosBancarios.get('dados_titular');
    const cpf = array.at(this.indice).get("cpf");
    const cnpj = array.at(this.indice).get('cnpj');
    const data_nasc = array.at(this.indice).get('data_nasc');
    const cpfCtrl: AbstractControl = this.formDadosBancarios.get(['dados_titular', this.indice, 'cpf']);
    const pessoa_juridicaCtrl: AbstractControl = this.formDadosBancarios.get(['dados_titular', this.indice, 'pessoa_juridica'])
    const cnpjCtrl: AbstractControl = this.formDadosBancarios.get(['dados_titular', this.indice, 'cnpj']);
    const data_nascCtrl: AbstractControl = this.formDadosBancarios.get(['dados_titular', this.indice, 'data_nasc']);
    const reqValidators: ValidatorFn[] = [Validators.required, Validators.pattern(this.cpf_REGEXP)];
    if (e == true) {
      data_nascCtrl.clearValidators();
      cpfCtrl.clearValidators();
      cnpjCtrl.setValidators(reqValidators);
    }else{
      cnpjCtrl.clearValidators();
      cpfCtrl.setValidators(reqValidators);
      data_nascCtrl.setValidators(reqValidators);
    }
    data_nascCtrl.updateValueAndValidity();
    cpfCtrl.updateValueAndValidity();
    cnpjCtrl.updateValueAndValidity();
  }

但不是打印 false 而是打印 undefined。有人能帮我吗?谢谢

enter image description here

最佳答案

看来您正在使用“recebeValidators”函数中的函数参数“e”隐藏类属性。

代码:

console.log("test", this.e);

实际上应该是:

console.log("test", e);

要排除 EventEmitter 中可能出现的转换错误,请尝试不要重复使用参数函数。示例:

selectPessoaFisica(e:any) {
    e = false;
    this.modelChanged.emit(e)
}

可以重写为:

selectPessoaFisica() {
    this.modelChanged.emit(false);
}

接收函数中还有一个额外的参数:

这个:

recebeValidators(model: dadosAcordo, e: boolean) {

应该是:

recebeValidators(e: boolean) {

关于javascript - 将数据从子组件发送到父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43456086/

相关文章:

javascript - 甜蜜警报 html 选项

angular - ngFor 中的动态组件

path - 如何在 Webpack 配置中创建多个输出路径

r - 如何在观星者输出中省略开始表

javascript - 可能是 for 循环中的警报

javascript - 如何让我的按钮改变一个变量?

javascript - 如何预警我的网站可能因浏览器更新而出现 "break"

javascript - 为什么函数声明不是语句而变量声明是

Angular 5在两个组件之间共享函数和变量

javascript - 从 DOM 调用服务函数 - Angular 2