Включение / отключение поля реактивных форм Angular 2

Я пытаюсь создать простой угловые 2 реактивные формы с адресом электронной почты и номером телефона. Ниже мой код. Здесь у меня две проблемы.

  1. Первоначально кнопка проверки должна быть отключена. Он должен быть включен, только когда вводится поле электронной почты.

  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]
});

Я столкнулся с проблемой при вставке кода. Это не происходит должным образом. Я пытаюсь правильно вставить

Nancy 04.06.2018 08:27

Да, теперь мой полный код доступен

Nancy 04.06.2018 08:28
stackoverflow.com/questions/49205601/…
Eliseo 04.06.2018 08:35
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
3
13 095
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать свойства Angular FormContol, например

  • грязный
  • коснулся
  • нетронутый
  • ошибки

сделать это.

Что вам нужно сделать, так это проверить статус formControl и отключить поля или кнопки в зависимости от ваших требований.

Основная проблема в реактивной форме для включения / отключения элемента управления заключается в том, что вам нужно использовать метод disable () или enable (). свойства грязные, тронутые, нетронутые недостаточно, чтобы отключить элемент управления

Eliseo 04.06.2018 09:25

Я не могу ответить на этот вопрос .. Ребята, вы можете мне помочь?

Nancy 04.06.2018 09:32
Ответ принят как подходящий

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 04.06.2018 10:16

@Nancy, вы можете закомментировать this.form.disable(); в AppComponent.

Pengyy 04.06.2018 10:17

Вы можете включить / отключить управление с помощью:

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

Возможно, я опаздываю с ответом на этот вопрос, но, поскольку я нашел полезным, я решил ответить на него, так как это может быть полезно для вас или кого-то еще!

Другие вопросы по теме