Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

FormArray: checkboxes dinamicos

Para este exemplo iremos utilizar um array com dados mockados para exemplificar o cenario. Ao trabalhar com multiplos valores para um mesmo campo o Angular possui uma classe especifica para auxiliar o gerenciamento dos dados, FormArray pode ser utilizado tanto para checkboxes dinamicos quanto para formularios aninhados.

Existem diversas formas de realizar a declaracao de um FormArray, vamos utilizar o exemplo mais comum na comunidade de desenvolvimento, que consiste na declaracao de um objeto do tipo FormArray separadamento e em seguida a inclusao no formulario principal.

// ...imports

@Component({
  selector: 'app-data-driven-form',
  templateUrl: './data-driven-form.component.html',
  styleUrls: ['./data-driven-form.component.css']
})
export class DataDrivenFormComponent implements OnInit {

  // ...demais atributos
  public frameworks = ['Agular', 'React', 'Vue', 'Sencha'];

  constructor(private formBuilder: FormBuilder, private http: HttpClient, private dadosService: DadosService, private cepService: CepService) { }

  ngOnInit(): void {
    this.formulario = this.formBuilder.group({
      nome: [null, Validators.required],
      email: [null, [Validators.required, Validators.email]],
      endereco: this.formBuilder.group({
        cep: [null, Validators.required],
        numero: [null, Validators.required],
        rua: [null, Validators.required],
        complemento: null,
        bairro: [null, Validators.required],
        cidade: [null, Validators.required],
        estado: [null, Validators.required]
      }),
      tecnologias: null,
      newsLetter: null,
      termos: [null, Validators.pattern('true')],
      frameworks: this.buildFormArray() // chamada do metodo para obter o FormArray
    })
    this.dadosService.getEstadosBr().subscribe(
      estados => this.estados = estados
    )
  }

  // ...metodo para construir o FormArray
  public buildFormArray() {
    const values = this.frameworks.map(framework => new FormControl(false));
    return this.formBuilder.array(values);
  }

}

para realizar o link entre o template HTML e o formulario data driven utilizaremos a diretiva formArrayName do angular que ira indicar o FormArray no interior do FormGroup, alem disso e importante observar que os array e apenas um conjunto de FormControl inicializado com o valor false, logo para exibir o nome dos frameworks na tela iremos utilizar o proprio array que contem os valores (neste exemplo this.framaworks[i]) pegando cada elemento atraves do indice, e para realizar o link com o elemento correspondente do FormArray, para a diretiva formControlName e passado o indice do FormControl no interior do FormArray.

<form class="form-horizontal" [formGroup]="formulario" (ngSubmit)="onSubmit()">
  <div class="form-group">
    
    <!-- demais campos do formulario -->

    <div class="col-md-3" [ngClass]="aplicaCssErro('frameworks')">
      <div id="frameworks">
        <label for="frameworks" class="control-label">Frameworks</label>
        <div id="frameworks">
          <div class="checkbox col-sm-4" formArrayName="frameworks" *ngFor="let control of getFrameworksControls(); let i = index">
            <label>
              <input type="checkbox" [formControlName]="i"> 
            </label>
          </div>
        </div>
      </div>
    </div>
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
<app-form-debug [formulario]="formulario"></app-form-debug>


checkboxes dinamicos com FormArray.