У меня есть массив форм внутри formbuilder, и я динамически меняю формы, то есть при загрузке данных из приложения 1 и т. Д.
Проблема, с которой я сталкиваюсь, заключается в том, что все данные загружаются, но данные в массиве форм остаются и просто объединяют старые элементы с новыми.
Как мне очистить этот formarray, чтобы в нем были только новые элементы.
Я пробовал это
const control2 = <FormArray>this.registerForm.controls['other_Partners'];
control2.setValue([]);
но это не работает.
Любые идеи? Благодарность
в 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 не вызывается при нажатии
angular
angular2-forms
Карл О'Коннор
источник
источник
Ответы:
У меня была такая же проблема. Есть два способа решить эту проблему.
Сохранить подписку
Вы можете вручную очистить каждый элемент FormArray, вызвав
removeAt(i)
функцию в цикле.Дополнительную информацию см. В документации FormArray .
Более чистый метод (но ломает ссылки на подписку)
Вы можете заменить весь FormArray на новый.
источник
formArray.clear();
Или вы можете просто очистить элементы управления
Добавить что - нибудь
array
Очистить массив
Когда у вас выбрано и очищено несколько вариантов, иногда вид не обновляется. Обходной путь - добавить
ОБНОВИТЬ
Более элегантное решение для использования массивов форм - это использование геттера в верхней части вашего класса, после чего вы можете получить к нему доступ.
И использовать его в шаблоне
Сброс настроек:
От себя:
Удалить значение по индексу: 1
ОБНОВЛЕНИЕ 2:
Получите частичный объект, получите все ошибки как JSON и многие другие функции, используйте NaoFormsModule
источник
inFormArray.at(1).remove();
дает мне[ts] Property 'remove' does not exist on type 'AbstractControl'.
ошибку транспилятора.let c of inFormArray
должно бытьlet c of inFormArray.controls
?Начиная с Angular 8+ вы можете использовать
clear()
для удаления всех элементов управления в FormArray:Для предыдущих версий рекомендуемый способ:
https://angular.io/api/forms/FormArray#clear
источник
Угловой 8
просто используйте
clear()
метод formArrays:источник
Angular v4.4, если вам нужно сохранить ту же ссылку на экземпляр FormArray, попробуйте следующее:
источник
Предупреждение!
В документации Angular v6.1.7 FormArray говорится:
Имейте это в виду, если вы используете
splice
функцию непосредственно вcontrols
массиве в качестве одного из предложенных ответов.Используйте
removeAt
функцию.источник
Вы можете легко определить геттер для своего массива и очистить его следующим образом:
источник
Обновление: в Angular 8 наконец-то появился метод очистки массива FormArray.clear ()
источник
Начиная с Angular 8 вы можете использовать
this.formArray.clear()
для очистки всех значений в массиве форм. Это более простая и эффективная альтернатива удалению всех элементов по одному.источник
Используйте FormArray.clear (), чтобы удалить все элементы массива в FormArray
источник
При условии, что структура данных для того, что вы будете заменять информацию в массиве, соответствует тому, что уже есть, вы можете использовать
patchValue
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html#!#reset-anchor
В качестве альтернативы вы можете использовать
reset
Вот разветвленная демонстрация Plunker из некоторых моих предыдущих работ, демонстрирующая очень простое использование каждого из них.
источник
Я никогда не пробовал использовать formArray, я всегда работал с FormGroup, и вы можете удалить все элементы управления, используя:
будучи formGroup экземпляром FormGroup.
источник
Я очень опоздал, но нашел другой способ, где петли не нужны. вы можете сбросить массив, установив элемент управления массивом на пустой.
Код ниже сбросит ваш массив.
this.form.setControl('name', this.fb.array([]))
источник
Циклу while потребуется много времени для удаления всех элементов, если в массиве есть 100 элементов. Вы можете очистить свойства элементов управления и значений FormArray, как показано ниже.
clearFormArray = (formArray: FormArray) => {formArray.controls = []; formArray.setValue ([]); }
источник
Чтобы код оставался чистым, я создал следующий метод расширения для всех, кто использует Angular 7 и ниже. Это также можно использовать для расширения любых других функций реактивных форм.
источник