Eu tenho uma matriz de formulário dentro de um formbuilder e estou alterando formulários dinamicamente, ou seja, ao clicar em carregar dados do aplicativo 1 etc.
O problema que estou tendo é que todos os dados carregam, mas os dados no formarray permanecem e apenas concatam os itens antigos com os novos.
Como faço para limpar o formarray para ter apenas os novos itens.
Eu tentei isso
const control2 = <FormArray>this.registerForm.controls['other_Partners'];
control2.setValue([]);
mas não funciona.
Alguma ideia? obrigado
em nginit
ngOnInit(): void {
this.route.params.subscribe(params => { alert(params['id']);
if (params['id']) {
this.id = Number.parseInt(params['id']);
}
else { this.id = null;}
});
if (this.id != null && this.id != NaN) {
alert(this.id);
this.editApplication();
this.getApplication(this.id);
}
else
{
this.newApplication();
}
}
onSelect(Editedapplication: Application) {
this.router.navigate(['/apply', Editedapplication.id]);
}
editApplication() {
this.registerForm = this.formBuilder.group({
id: null,
type_of_proposal: ['', Validators.required],
title: ['', [Validators.required, Validators.minLength(5)]],
lead_teaching_fellow: ['', [Validators.required, Validators.minLength(5)]],
description: ['', [Validators.required, Validators.minLength(5)]],
status: '',
userID: JSON.parse(localStorage.getItem('currentUser')).username,
contactEmail: JSON.parse(localStorage.getItem('currentUser')).email,
forename: JSON.parse(localStorage.getItem('currentUser')).firstname,
surname: JSON.parse(localStorage.getItem('currentUser')).surname,
line_manager_discussion: true,
document_url: '',
keywords: ['', [Validators.required, Validators.minLength(5)]],
financial_Details: this.formBuilder.group({
id: null,
buying_expertise_description: ['', [Validators.required, Validators.minLength(2)]],
buying_expertise_cost: ['', [Validators.required]],
buying_out_teaching_fellow_cost: ['', [Validators.required]],
buying_out_teaching_fellow_desc: ['', [Validators.required, Validators.minLength(2)]],
travel_desc: ['', [Validators.required, Validators.minLength(2)]],
travel_cost: ['', [Validators.required]],
conference_details_desc: ['', [Validators.required, Validators.minLength(2)]],
conference_details_cost: ['', [Validators.required]],
}),
partners: this.formBuilder.array
(
[
//this.initEditPartner(),
//this.initEditPartner()
// this.initMultiplePartners(1)
]
),
other_Partners: this.formBuilder.array([
//this.initEditOther_Partners(),
])
});
}
getApplication(id)
{
this.applicationService.getAppById(id, JSON.parse(localStorage.getItem('currentUser')).username)
.subscribe(Response => {
if (Response.json() == false) {
this.router.navigateByUrl('/');
}
else {
this.application = Response.json();
for (var i = 0; i < this.application.partners.length;i++)
{
this.addPartner();
}
for (var i = 0; i < this.application.other_Partners.length; i++) {
this.addOther_Partner();
}
this.getDisabledStatus(Response.json().status);
(<FormGroup>this.registerForm)
.setValue(Response.json(), { onlySelf: true });
}
}
);
}
ngonitit não está sendo chamado ao clicar
angular
angular2-forms
Karl O'Connor
fonte
fonte
Respostas:
Eu tive o mesmo problema. Existem duas maneiras de resolver esse problema.
Preservar assinatura
Você pode limpar manualmente cada elemento FormArray chamando a
removeAt(i)
função em um loop.Consulte a documentação do FormArray para obter mais informações.
Método mais limpo (mas quebra as referências de assinatura)
Você pode substituir FormArray inteiro por um novo.
fonte
formArray.clear();
Ou você pode simplesmente limpar os controles
Adicionar algo
array
Limpe a matriz
Quando você tem várias opções selecionadas e desmarcadas, às vezes não atualiza a visualização. Uma solução alternativa é adicionar
ATUALIZAR
Uma solução mais elegante para usar matrizes de formulário é usar um getter no topo da sua classe e então você pode acessá-lo.
E para usá-lo em um modelo
Redefinir:
Empurrar:
Remova o valor do índice: 1
ATUALIZAÇÃO 2:
Obtenha objeto parcial, obtenha todos os erros como JSON e muitos outros recursos, use o NaoFormsModule
fonte
inFormArray.at(1).remove();
me dá um[ts] Property 'remove' does not exist on type 'AbstractControl'.
erro de transpiler.let c of inFormArray
deverialet c of inFormArray.controls
?A partir do Angular 8+, você pode usar
clear()
para remover todos os controles no FormArray:Para versões anteriores, a forma recomendada é:
https://angular.io/api/forms/FormArray#clear
fonte
Angular 8
simplesmente use o
clear()
método em formArrays:fonte
Angular v4.4 se você precisar salvar a mesma referência para a instância do FormArray, tente o seguinte:
fonte
Atenção!
A documentação do FormArray do Angular v6.1.7 diz:
Lembre-se disso se estiver usando a
splice
função diretamente nacontrols
matriz como uma das respostas sugeridas.Use a
removeAt
função.fonte
Você pode definir facilmente um getter para sua matriz e limpá-lo da seguinte maneira:
fonte
Atualização: o Angular 8 finalmente obteve o método para limpar o Array FormArray.clear ()
fonte
Desde Angular 8 você pode usar
this.formArray.clear()
para limpar todos os valores na matriz do formulário. É uma alternativa mais simples e eficiente para remover todos os elementos um por umfonte
Use FormArray.clear () para remover todos os elementos de uma matriz em um FormArray
fonte
Forneceu a estrutura de dados para o que você estará substituindo as informações no array com o que já está lá você pode usar
patchValue
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html#!#reset-anchor
Alternativamente, você pode usar
reset
Aqui está uma demonstração bifurcada do Plunker de algum trabalho anterior meu demonstrando uma utilização muito simples de cada um.
fonte
Nunca tentei usar formArray, sempre trabalhei com FormGroup e você pode remover todos os controles usando:
sendo formGroup uma instância de FormGroup.
fonte
Estou muito atrasado, mas encontrei outra maneira em que você não precisa de loops. você pode redefinir o array definindo o controle do array como vazio.
O código abaixo irá redefinir sua matriz.
this.form.setControl('name', this.fb.array([]))
fonte
O loop while levará muito tempo para excluir todos os itens se a matriz tiver 100 itens. Você pode esvaziar os controles e propriedades de valor do FormArray como abaixo.
clearFormArray = (formArray: FormArray) => {formArray.controls = []; formArray.setValue ([]); }
fonte
Para manter o código limpo, criei o seguinte método de extensão para qualquer pessoa usando Angular 7 e inferior. Isso também pode ser usado para estender qualquer outra funcionalidade dos formulários reativos.
fonte