Я пытаюсь создать простой угловые 2 реактивные формы с адресом электронной почты и номером телефона. Ниже мой код. Здесь у меня две проблемы.
Первоначально кнопка проверки должна быть отключена. Он должен быть включен, только когда вводится поле электронной почты.
Вторая проблема: я хочу, чтобы одновременно было включено только одно поле. Если пользователь начинает вводить электронную почту, затем номер телефона должен быть отключен, и наоборот. Кнопка «Сохранить» будет активна, если введен адрес электронной почты ИЛИ номер телефона.
Как мне этого добиться?
<form [formGroup] = "personalDtlsForm">
<div class = "form-group" [ngClass] = "displayFieldCss('inputValue')">
<div class = "row">
<div class = "col">
<label for = "inputValue" class = "control-label required">Email</label>
</div>
</div>
<div class = "row">
<div class = "col-9">
<input type = "text" id = "email" class = "form-control" formControlName = "inputValue">
</div>
<div class = "col-3">
<button type = "button" id = "verifyBtn" class = "btn btn-primary btn-large" (click) = "verify()">Verify</button>
</div>
</div>
</div>
<div class = "form-group row" [ngClass] = "displayFieldCss('phoneNo')">
<div class = "col paddingTop">
<label for = "phoneNo" class = "userID control-label textColor">Phone
</label>
<input type = "number" class = "form-control" id = "phoneNo" formControlName = "phoneNo">
</div>
</div>
<div class = "viewdetailbtn">
<button type = "button" [disabled] = "!personalDtlsForm.valid" class = "btn btn-primary btn-large btnwidth marginBottom" (click) = "savePersonalDtls()">Save</button>
</div>
</form>
this.personalDtlsForm = this.formBuilder.group({
inputValue: [null, [Validators.required, Validators.email]],
phoneNo: [null, Validators.required]
});
Да, теперь мой полный код доступен





Вы можете использовать свойства Angular FormContol, например
сделать это.
Что вам нужно сделать, так это проверить статус formControl и отключить поля или кнопки в зависимости от ваших требований.
Основная проблема в реактивной форме для включения / отключения элемента управления заключается в том, что вам нужно использовать метод disable () или enable (). свойства грязные, тронутые, нетронутые недостаточно, чтобы отключить элемент управления
Я не могу ответить на этот вопрос .. Ребята, вы можете мне помочь?
Initially verify button should be disable. It should be enabled , only when email field is entered.
Вы можете просто привязать disabled с действительным статусом поля email. Обратите внимание, что когда состояние входа отключено, это не будет valid или invalid.
<button type = "button" [disabled] = "personalDtlsForm.get('inputValue').invalid">Verify</button>
Second issue is I want to have only one field enabled at time. If user starts typing in email, then phone number should be disabled and vice versa.
Чтобы отключить все другие элементы управления формы в форме, сначала нам нужно получить доступ ко всем из них, мы можем сделать это через formGroupDirective.directives.
Я создал специальную директиву для достижения того, чего вы хотите.
@Directive({
selector: '[disableAllOthers]'
})
export class DisableAllOthers {
constructor(
private elem: ElementRef,
private control: NgControl,
private renderer: Renderer2
) {
this.elem.nativeElement.addEventListener('mouseover', () => {
(this.control as FormControlName).formDirective.directives.forEach(elem => {
if (elem === this.control) {
elem.control.enable();
} else {
elem.control.disable();
}
});
});
}
}
Для click / focus событие не сработает, когда вход отключен, здесь я изменил disable/enable через событие наведите указатель мыши на, см. демонстрация.
Все поля должны быть изначально активированы. Только когда пользователь вводит адрес электронной почты, телефон Нет поля не должно быть отключено
@Nancy, вы можете закомментировать this.form.disable(); в AppComponent.
Вы можете включить / отключить управление с помощью:
this.personalDtlsForm.controls['phoneNo'].enable()
this.personalDtlsForm.controls['phoneNo'].disable()
Итак, чтобы отключить поле, вы должны подписаться на valueChanges другого поля и отключить другое поле, если это value !== '' или что-то в этом роде.
Пример:
this.personalDtlsForm.controls['phoneNo'].valueChanges.subscribe(
value => {
if (value !== ''){
this.personalDtlsForm.controls['inputValue'].disable();
} else {
this.personalDtlsForm.controls['inputValue'].enable();
}
}
);
И конечно такая же подписка на inputValue formControl
Что касается вашего второго вопроса, вы можете установить переменную isFormValid в операторе if, когда value !== '', что означает, что введен хотя бы один из них.
Окончательная проверка включения кнопки может быть примерно такой:
isFormValid && personalDtlsForm.valid
Если вы используете подход с реактивной формой для получения входных данных от пользователя, а затем вы хотите включить или отключить поля в зависимости от действий пользователя. Итак, вы можете сделать следующее ...
Предположим, ваша FormGroup выглядит так ->
// cityRef field will be automatically disabled intially, as property disabled: true is set
this.signUpFrom = new FormGroup({
userData: new FormGroup({
mobileNumber: new FormControl(null, [Validators.required, Validators.minLength(10), Validators.maxLength(10)]),
password: new FormControl(null, [Validators.required]),
userType: new FormControl('VENDOR')
}),
otherData: new FormGroup({
cityRef: new FormControl({ value: null, disabled: true }, [Validators.required]),
email: new FormControl(null, [Validators.required, Validators.email]),
address: new FormControl(null, [Validators.required])
}),
name: new FormControl(null, [Validators.required]),
});
Теперь, если вы хотите отключить / включить электронную почту, пароль, имя и т. д. В зависимости от действий пользователя. Вы можете сделать это всего за один шаг. (Пример доступа к разным полям)
this.signUpFrom.get('otherData.email').enable(); // To enable
this.signUpFrom.get('otherData.email').disable(); // To disable
this.signUpFrom.get('userData.password').enable(); // To enable
this.signUpFrom.get('userData.password').disable(); // To disable
this.signUpFrom.get('name').enable(); // To enable name field
this.signUpFrom.get('name').disable(); // To disable name field
Вы можете поместить эти коды в функцию, которая может быть вызвана в onClick или onChanges и т. д.
Даже вы можете получить текущую ситуацию с полями, когда она отключена или включена, используя
this.signUpFrom.get('name').disabled; // return true if disabled
this.signUpFrom.get('name').enabled; // return true if enabled
Возможно, я опаздываю с ответом на этот вопрос, но, поскольку я нашел полезным, я решил ответить на него, так как это может быть полезно для вас или кого-то еще!
Я столкнулся с проблемой при вставке кода. Это не происходит должным образом. Я пытаюсь правильно вставить