Как очистить форму после отправки в Angular 2?
У меня есть простой компонент angular 2 с шаблоном. Как очистить форму и все поля после отправки?. Я не могу перезагрузить страницу.
После установки данных с полем date.setValue('')
будет установлено touched
.
import {Component} from 'angular2/core';
import {FORM_DIRECTIVES, FormBuilder, ControlGroup, Validators, Control} from 'angular2/common';
@Component({
selector: 'loading-form',
templateUrl: 'app/loadings/loading-form.component.html',
directives: [FORM_DIRECTIVES]
})
export class LoadingFormComponent {
private form:ControlGroup;
private date:Control;
private capacity:Control;
constructor(private _loadingsService:LoadingsService, fb:FormBuilder) {
this.date = new Control('', Validators.required);
this.capacity = new Control('', Validators.required);
this.form = fb.group({
'date': this.date,
'capacity': this.capacity
});
}
onSubmit(value:any):void {
//send some data to backend
}
}
погрузо-form.component.html
<div class="card card-block">
<h3 class="card-title">Loading form</h3>
<form (ngSubmit)="onSubmit(form.value)" [ngFormModel]="form">
<fieldset class="form-group" [class.has-danger]="!date.valid && date.touched">
<label class="form-control-label" for="dateInput">Date</label>
<input type="text" class="form-control form-control-danger form-control-success" id="dateInput"
min="0" placeholder="Enter loading date"
[ngFormControl]="form.controls['date']">
</fieldset>
<fieldset class="form-group" [class.has-danger]="!capacity.valid && capacity.touched">
<label class="form-control-label" for="capacityInput">Capacity</label>
<input type="number" class="form-control form-control-danger form-control-success" id="capacityInput"
placeholder="Enter capacity"
[ngFormControl]="form.controls['capacity']">
</fieldset>
<button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit
</button>
</form>
</div>
Ответы
Ответ 1
См. также https://angular.io/docs/ts/latest/guide/reactive-forms.html (раздел "reset флаги формы" )
>= rc.6
В RC.6 его необходимо поддерживать для обновления модели формы. Создание новой группы форм и назначение myForm
[formGroup]="myForm"
также будет поддерживаться (https://github.com/angular/angular/pull/11051#issuecomment-243483654)
>= RC.5
form.reset();
В модуле новых форм ( >= RC.5) NgForm
имеет метод reset()
, а также поддерживает событие формы reset
.
https://github.com/angular/angular/blob/6fd5bc075d70879c487c0188f6cd5b148e72a4dd/modules/%40angular/forms/src/directives/ng_form.ts#L179
<= RC.3
Это будет работать:
onSubmit(value:any):void {
//send some data to backend
for(var name in form.controls) {
(<Control>form.controls[name]).updateValue('');
/*(<FormControl>form.controls[name]).updateValue('');*/ this should work in RC4 if `Control` is not working, working same in my case
form.controls[name].setErrors(null);
}
}
См. также
Ответ 2
Как и у Angular2 RC5, myFormGroup.reset()
, похоже, делает трюк.
Ответ 3
В reset вашу форму после отправки вы можете просто вызвать this.form.reset()
. Вызывая reset()
, он будет:
- Отметьте элемент управления и дочернего элемента как нетронутый.
- Пометьте элемент управления и дочерние элементы как нетронутый.
- Задайте для элемента управления и дочерних элементов значение пользовательское значение или значение null.
- Обновить значение/достоверность/ошибки затронутых сторон.
Этот тянуть запрос для получения подробного ответа. FYI, этот PR уже был объединен с 2.0.0.
Надеюсь, это может быть полезно, и дайте мне знать, если у вас есть другие вопросы относительно форм Angular2.
Ответ 4
import {Component} from '@angular/core';
import {NgForm} from '@angular/forms';
@Component({
selector: 'example-app',
template: '<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
<input name="first" ngModel required #first="ngModel">
<input name="last" ngModel>
<button>Submit</button>
</form>
<p>First name value: {{ first.value }}</p>
<p>First name valid: {{ first.valid }}</p>
<p>Form value: {{ f.value | json }}</p>
<p>Form valid: {{ f.valid }}</p>',
})
export class SimpleFormComp {
onSubmit(f: NgForm) {
// some stuff
f.resetForm();
}
}
Ответ 5
Для угловой версии 4 вы можете использовать это:
this.heroForm.reset();
Но вам может понадобиться начальное значение, например:
ngOnChanges() {
this.heroForm.reset({
name: this.hero.name, //Or '' to empty initial value.
address: this.hero.addresses[0] || new Address()
});
}
Важно разрешить нулевую проблему в вашей ссылке на объект.
Ссылка ссылка, поиск "сбросить флаги формы".
Ответ 6
Сделайте вызов clearForm();
в файле .ts
Попробуйте сделать снимок фрагмента кода, чтобы очистить данные формы.
clearForm() {
this.addContactForm.reset({
'first_name': '',
'last_name': '',
'mobile': '',
'address': '',
'city': '',
'state': '',
'country': '',
'zip': ''
});
}
Ответ 7
Существует новая дискуссия об этом (https://github.com/angular/angular/issues/4933). Пока есть только некоторые хаки, которые позволяют очистить форму, например, воссоздать всю форму после отправки: https://embed.plnkr.co/kMPjjJ1TWuYGVNlnQXrU/
Ответ 8
Я нашел другое решение. Это немного хакерский, но его широко доступный в мире angular2.
Так как директива * ngIf удаляет форму и воссоздает ее, ее можно просто добавить в форму и привязать ее к некоторой переменной formSuccessfullySent
. = > Это приведет к воссозданию формы и, следовательно, reset состояниям управления вводом.
Конечно, вы также должны очистить модельные переменные. Мне было удобно иметь определенный класс модели для моих полей формы. Таким образом, я могу reset все поля так же просто, как создать новый экземпляр этого класса модели.:)
Ответ 9
Hm, теперь (23 января 2017 года с angular 2.4.3) я сделал это так:
newHero() {
return this.model = new Hero(42, 'APPLIED VALUE', '');
}
<button type="button" class="btn btn-default" (click)="heroForm.resetForm(newHero())">New Hero</button>
Ответ 10
Вот как я это делаю в Angular 7.3
// you can put this method in a module and reuse it as needed
resetForm(form: FormGroup) {
form.reset();
Object.keys(form.controls).forEach(key => {
form.get(key).setErrors(null) ;
});
}
Не было необходимости вызывать form.clearValidators()
Ответ 11
Ниже код работает для меня в Angular 4
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
export class RegisterComponent implements OnInit {
registerForm: FormGroup;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.registerForm = this.formBuilder.group({
empname: [''],
empemail: ['']
});
}
onRegister(){
//sending data to server using http request
this.registerForm.reset()
}
}
Ответ 12
Вот как я это делаю Angular 8:
Получите местную ссылку вашей формы:
<form name="myForm" #myForm="ngForm"></form>
@ViewChild('myForm', {static: false}) myForm: NgForm;
А когда вам нужно сбросить форму, вызывайте метод resetForm
:
this.myForm.resetForm();
Для работы вам понадобится FormsModule
из @angular/forms
. Обязательно добавьте его в свой модуль импорта.
Ответ 13
resetForm(){
ObjectName = {};
}