Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Passar nome da função do (ngSubmit) por parâmetro

Pessoal, criei um controle que validação de formulários, só que estou tendo problemas ao passar o nome da função do ngSubmit por parâmetro.

O componente que eu criei recebe 2 parâmetros. O id do formulário que estou passando e o nome da função que será executada ao clicar no botão submit.

O uso do componente se resume a isso:

<validation-form formId="ResetPasswordForm" submit="resetPassword()"> </validation-form>

O .ts do componente está assim:

import { Component, Input, Injector, ElementRef, ViewChild } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { AppComponentBase } from '@shared/app-component-base';
import { accountModuleAnimation } from '@shared/animations/routerTransition';


@Component({
  selector: 'validation-form',
  templateUrl: './validation-form.component.html',
  styleUrls: ['./validation-form.component.less'],
  animations: [accountModuleAnimation()]
})
export class ValidationFormComponent extends AppComponentBase {

  @ViewChild('form') form: ElementRef;

  @Input() formId: string;
  @Input() submit: string;
  constructor(
    injector: Injector,
    private _router: Router,
    private _activatedRouter: ActivatedRoute
  ) {
    super(injector);
  }
}

O template html do meu componente está dessa maneira:

<form [id]="formId" method="post" novalidate [(ngSubmit)]="">
    <ng-content></ng-content>
</form>

Gostaria de saber como colocar o valor que está sendo passado para a variável @Input submit para a diretiva (ngSubmit).

Outra coisa, ao ser executada essa função, ela vai ser executada no validation-form.component.ts ou no componente que foi chamado?

3 respostas

Fala aí Tauan, tudo bem? Me desculpe mas não consegui entender o problema/necessidade, poderia explicar com mais detalhes o cenário/fluxo/necessidade?

Fico no aguardo.

O que eu quero é passar o evento do componente pai (componente que vai utilizar o validation-form), para o componente filho (validation-form). Esse evento será usado ao realizar um submit no formulário no validation-form. Pelas minhas pesquisas, aparentemente eu tenho que usar o decorator @Output ao invés do @Input para passar o evento como referência. Conseguiu entender melhor?

solução!

Exatamente Tauan, para realizar comunicação de filhos => pai, você precisa utilizar o @Ouput.

Basicamente no filho você anota uma propriedade com @Output, essa propriedade deve ser um novo objeto da classe EventEmitter:

@Output() mandarNome = new EventEmitter();

Depois, você pode adicionar um botão no filho que irá mandar um evento para o pai:

<button (click)="mandarParaPai()" type="button">Mandar para o mai</button>

mandarParaPai() {
    this.mandarNome.emit('Chegou no pai');
}

Veja que para mandar o evento para o pai, utiliza-se a função .emit.

Dai no pai, você precisa criar uma função que irá receber esse nome (no caso Chegou no pai):

nome: string;

receberNome(nome) {
    this.name = nome;
}

Dai no seu template do pai, precisa criar um event bind do @Output do filho com a função que irá receber o .emit:

<div style="text-align:center">
    {{ nome }}
    <app-child (mandarNome)="receberNome($event)"></app-child>
</div>

Espero ter ajudado.