#angular #angular-reactive-forms #form-submit
#angular #угловые реактивные формы #форма-отправить
Вопрос:
Я использую Angular8 с реактивной формой. Изначально я отключаю кнопку отправки, пока вся форма не будет заполнена действительными данными.
<div>
<form>
...........
</for>
<button [disabled]="(checkifSaveEnabled() amp;amp; !formCreateNewPlan.valid)"
(click)="createNewPlan()">Save</button>
</div>
В файле класса (TS):
checkifSaveEnabled() {
if (this.formCreateNewPlan.pristine || !this.formCreateNewPlan.valid) {
return true;
}
return false;
}
createNewPlan(): void {
this.submitted = true;
this.myservice.create(this.formCreateNewPlan.value).subscribe(result => {
if (result.success amp;amp; result.data.planId > 0) {
...
}
}
Здесь все работает нормально. Но я хочу отключить кнопку при отправке (чтобы избежать нескольких кликов) и включить ее обратно, если я получу какие-либо ошибки из ответа моего сервиса (API). Как этого добиться?
Ответ №1:
Вы можете использовать submitted
, что будет true, если API выполняется, и станет false, если API разрешит или отклонит. Теперь вы можете использовать оператор finalize для установки submitted
внутри него значения false. Она будет выполнена после успешного или ошибочного блока observable.
createNewPlan(): void {
this.submitted = true;
this.myservice.create(this.formCreateNewPlan.value)
.pipe(finalize(() => { this.submitted = false; }))
.subscribe(result => {
if (result.success amp;amp; result.data.planId > 0) {
}
}, (error) => {
console.log(error)
});
Соответствующее изменение в шаблоне
<button [disabled]="submitted || (checkifSaveEnabled() amp;amp; !formCreateNewPlan.valid)"
(click)="createNewPlan()">Save</button>
Комментарии:
1. при отправке кнопка теперь отключается. Если я получаю сообщение об ошибке сервера «Дублирующая запись», и я хочу это исправить, как повторно включить ее после исправления значений в форме?
2. Я не понял вашу точку зрения. После успешного или ошибочного ответа кнопка будет включена автоматически из-за кода, написанного внутри блока finalize. Пожалуйста, дайте мне знать, если я что-то здесь пропустил.
Ответ №2:
вам просто нужно добавить this.submitted
ее в атрибут disabled кнопки, см. Код ниже
<button [disabled]="submitted || (checkifSaveEnabled() amp;amp; !formCreateNewPlan.valid)"
(click)="createNewPlan()">Save</button>
Комментарии:
1. при отправке кнопка теперь отключается. Если я получаю сообщение об ошибке сервера и хочу это исправить, как повторно включить его после исправления значений в форме?
2. после ответа сервера, который вы можете сделать
this.submitted=false
(как в случае успеха, так и в случае ошибки), это позволит включить кнопку3. но она включается сразу после получения ошибки. Она должна включиться после внесения исправлений в форму
4. затем в этом случае измените
||
наamp;amp;
5. ОК… понял вашу проблему… вы можете оставить
||
все как есть и вызвать метод проверки формы после ответа сервера и в соответствии с ответом makethis.submitted=false
… надеюсь, это должно помочь