по крайней мере одно поле требуется в угловых 4 формах - PullRequest
0 голосов
/ 26 апреля 2018

Я использую угловые 4 формы и у меня есть несколько полей. и first_name, last_name и company очень важны для меня. Я хочу заставить пользователя заполнить одно из этих 3 полей. как мне это сделать?

вот коды .ts:

this.contactForm = this.fb.group({
        first_name: [null, Validators.compose([Validators.required])],
        last_name: [null, Validators.compose([Validators.required])],
        email: [null, Validators.compose([this.validateEmail])],
        company: [null],
        position: [null],
      });

HTML:

 <form [formGroup]="contactForm" fxLayout="column">
            <md-input-container class="data_light">
              <input class="data_font capital" mdInput placeholder="{{'Contacts.FirstName' | translate}}" [formControl]="contactForm.controls['first_name']">
            </md-input-container>
            <small *ngIf="contactForm.controls['first_name'].hasError('required') && contactForm.controls['first_name'].touched" class="mat-text-warn data_light">{{'Contacts.firstNameReq' | translate}}
            </small>
            <md-input-container class="data_light">
              <input class="data_font capital" mdInput placeholder="{{'Contacts.lastName' | translate}}" [formControl]="contactForm.controls['last_name']">
            </md-input-container>
            <small *ngIf="contactForm.controls['last_name'].hasError('required') && contactForm.controls['last_name'].touched" class="mat-text-warn data_light">{{'Contacts.lastNameReq' | translate}}
            </small>
            <md-input-container class="data_light">
              <input class="data_font" mdInput placeholder="{{'Contacts.email' | translate}}" [formControl]="contactForm.controls['email']"
                (blur)="checkContactEmail()">
            </md-input-container>
            <small *ngIf="contactForm.controls['email'].hasError('validateEmail') && contactForm.controls['email'].dirty" class="mat-text-warn data_light">{{'Contacts.emailValid' | translate}}
            </small>
            <small *ngIf="!emailValid" class="mat-text-warn data_light">{{emailMessage}}
            </small>
            <md-input-container class="data_light">
              <input class="data_font capital" mdInput placeholder="{{'Contacts.Company' | translate}}" [formControl]="contactForm.controls['company']">
            </md-input-container>
            <md-input-container class="data_light">
              <input class="data_font capital" mdInput placeholder="{{'Contacts.Position' | translate}}" [formControl]="contactForm.controls['position']">
            </md-input-container>
          </form>

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018
private atLeastOneValidator = () => {
    return (controlGroup) => {
        let controls = controlGroup.controls;
        if ( controls ) {
            let theOne = Object.keys(controls).find(key=> controls[key].value!=='');
            if ( !theOne ) {
                return {
                    atLeastOneRequired : {
                        text : 'At least one should be selected'
                    }
                }
            }
        }
        return null;
    };
};

Выше есть многоразовый валидатор, и вы можете использовать его следующим образом:

 this.contactForm.setValidators(this.atLeastOneValidator())

Это делает весь contactForm недействительным, если ни одно из полей не имеет значения.

Обратите внимание, что проверка contactForm по умолчанию все равно будет работать, и вам не нужно заботиться о количестве полей в вашей форме, и все обрабатывается динамически

EDIT:

Обратите внимание, что atLeastOneValidator проверяет, чтобы значения не были пустыми, но если вы хотите сказать:

По крайней мере одно из этих полей должно быть valid, тогда вы можете просто настроить условия так, чтобыниже

 let theOne = Object.keys(controls).find(key=> controls[key].valid );

Затем вы можете использовать ошибку в своем шаблоне следующим образом:

 <small *ngIf="contactForm.hasError('atLeastOneRequired')" class="mat-text-warn data_light">{{contactForm.getError('atLeastOneRequired')}}
        </small>
0 голосов
/ 26 апреля 2018

Отключайте вашу кнопку, пока необходимые поля не будут заполнены пользователем

<button type='submit' [disabled]='!contactForm.valid'> Submit</button>

Затем вызовите функцию, чтобы проверить отключение следующим образом

<button type='submit' [disabled]='checkValid()'> Submit</button>
checkValid() {
  if(this.contactForm.get('first_name').valid || this.contactForm.get('last_name').valid || this.contactForm.get('email').valid) {
    return false;
  } else {
    return true;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...