Как добавить шаблон проверки формы в Angular 2?

У меня есть простая форма, которая должна проверять, не являются ли начало и конец ввода пробелом.

В HTML5 я сделаю так:

<input type="text" pattern="^(?!\s|.*\s$).*$">

Какое свойство является правильным для шаблона проверки в новой директиве Angular 2 ngControl? В официальном бета-API по-прежнему отсутствует документация по этой проблеме.


person Downhillski    schedule 01.01.2016    source источник
comment
В настоящее время нет простого способа сделать это. Вы можете написать свой собственный валидатор, пока не появится этот запрос на вытягивание, если он вообще будет .   -  person Eric Martinez    schedule 01.01.2016
comment
Вот пример того, как выполнить настраиваемую проверку, если вы пойдете по этому пути syntaxsuccess.com/viewarticle/   -  person TGH    schedule 01.01.2016


Ответы (6)


Теперь вам не нужно использовать FormBuilder и все эти сложные угловые штуки с проверкой правильности. Я поместил более подробную информацию из этого (Angular 2.0.8 - 3march2016): https://github.com/angular/angular/commit/38cb526

Пример из репо:

<input [ngControl]="fullName" pattern="[a-zA-Z ]*">

Тестирую, работает :) - вот мой код:

<form (ngSubmit)="onSubmit(room)" #roomForm='ngForm'  >
...
<input 
  id='room-capacity' 
  type="text" 
  class="form-control" 
  [(ngModel)]='room.capacity' 
  ngControl="capacity" 
  required
  pattern="[0-9]+" 
  #capacity='ngForm'>

Альтернативный подход (ОБНОВЛЕНИЕ июнь 2017 г.)

Проверка выполняется ТОЛЬКО на стороне сервера. Если что-то не так, сервер возвращает код ошибки, например, HTTP 400 и следующий объект json в ответ тело (как пример):

this.err = { 
    "capacity" : "too_small"
    "filed_name" : "error_name", 
    "field2_name" : "other_error_name",
    ... 
}

В шаблоне html я использую отдельный тег (div / span / small и т. Д.)

<input [(ngModel)]='room.capacity' ...>
<small *ngIf="err.capacity" ...>{{ translate(err.capacity) }}</small>

Если в «capacity» есть ошибка, то будет виден тег с переводом сообщения. Такой подход имеет следующие преимущества:

  • это очень просто
  • избегайте дублирования кода проверки бэкэнда на веб-интерфейсе (для проверки регулярного выражения это может предотвратить или усложнить атаки ReDoS)
  • контроль способа отображения ошибки (например, тег <small>)
  • backend возвращает error_name, который легко перевести на нужный язык во внешнем интерфейсе

Конечно, иногда я делаю исключение, если требуется проверка на стороне внешнего интерфейса (например, поле retypePassword при регистрации никогда не отправляется на сервер).

person Kamil Kiełczewski    schedule 10.03.2016
comment
Я просто проверяю (и тестирую) список изменений, упомянутый Крисом Сноуденом в его предыдущем ответе. Он дает основную подсказку. - person Kamil Kiełczewski; 11.03.2016
comment
Какова формула скрытия паттернов до этого нового типа? например : ng-pattern = / ^ (\ + \ 91 {1,2}) \ d {10} $ / - person cybercoder; 15.09.2016
comment
@VahidAlimohamadi Я не понимаю вопроса, не могли бы вы повторить его другими словами? - person Kamil Kiełczewski; 15.09.2016
comment
Когда я использую строку регулярного выражения, которая работает в angular 1.x как шаблон, в Angular2 она не сработает. Почему? - person cybercoder; 16.09.2016
comment
@VahidAlimohamadi удалите '/' в начале и добавьте в конце свое регулярное выражение. так что это должно быть в вашем случае: pattern = ^ (\ + \ 91 {1,2}) \ d {10} $ (может быть, вы также должны удалить или изменить обратную косую черту '\' в вашем регулярном выражении) - person Kamil Kiełczewski; 16.09.2016
comment
@ KamilKiełczewski, я все еще нахожу FormBuilder во многих примерах и документах. Вы можете помочь мне с любым документом без FormBuilder? - person cracker; 13.12.2016
comment
почему без FormBuilder? Вам не нужно использовать конструктор форм. Вы можете добавить проверку после ввода каждого символа (вы делаете это с помощью input attributte (change) = validate ($ event)) и в функции проверки в регулярном выражении проверки Typescript и отображать скрытое сообщение об ошибке в шаблоне - person Kamil Kiełczewski; 13.12.2016
comment
Как установить сообщение об ошибке с помощью этого метода? - person zennin; 25.01.2017
comment
@zennin Вы можете попробовать это (но я не проверяю): stackoverflow.com/questions/10361460/ - person Kamil Kiełczewski; 25.01.2017
comment
не могли бы вы помочь мне решить эту проблему stackoverflow.com/questions/52091334/ @ KamilKiełczewski - person Zhu; 30.08.2018

Начиная с версии 2.0.0-beta.8 (02.03.2016), Angular теперь включает в себя Validators.pattern валидатор регулярных выражений.

См. CHANGELOG

person Chris Snowden    schedule 04.03.2016
comment
Отличный ответ - вы спасете Первомайский день! :) - person Kamil Kiełczewski; 10.03.2016
comment
не могли бы вы помочь мне решить эту проблему stackoverflow.com/questions/52091334/ @ChrisSnowden - person Zhu; 30.08.2018

Вы можете создать свою форму с помощью FormBuilder, поскольку он позволяет более гибко настраивать форму.

export class MyComp {
  form: ControlGroup;

  constructor(@Inject()fb: FormBuilder) {  
    this.form = fb.group({  
      foo: ['', MyValidators.regex(/^(?!\s|.*\s$).*$/)]  
    });  
  }

Затем в вашем шаблоне:

<input type="text" ngControl="foo" />
<div *ngIf="!form.foo.valid">Please correct foo entry !</div> 

Вы также можете настроить класс CSS с ошибкой ng.

Поскольку на самом деле нет валидаторов для регулярных выражений, вам нужно написать свои собственные. Это простая функция, которая принимает элемент управления на входе и возвращает null, если он действителен, или StringMap, если он недействителен.

export class MyValidators {
  static regex(pattern: string): Function {
    return (control: Control): {[key: string]: any} => {
      return control.value.match(pattern) ? null : {pattern: true};
    };
  }
}

Надеюсь, это вам поможет.

person gentiane    schedule 31.01.2016
comment
Angular2 имеет собственный валидатор шаблонов. Источник: angular.io/docs/ts/latest/ api / forms / index / Validators-class.html - person zennin; 25.01.2017
comment
Точный. Но когда ответ был написан год назад, этого не произошло. - person gentiane; 25.01.2017

шаг за шагом настраиваемой проверки

HTML-шаблон

  <form [ngFormModel]="demoForm">
  <input  
  name="NotAllowSpecialCharacters"    
  type="text"                      
  #demo="ngForm"
  [ngFormControl] ="demoForm.controls['spec']"
  >

 <div class='error' *ngIf="demo.control.touched">
   <div *ngIf="demo.control.hasError('required')"> field  is required.</div>
   <div *ngIf="demo.control.hasError('invalidChar')">Special Characters are not Allowed</div>
 </div>
  </form>

Компонент App.ts

import {Control, ControlGroup, FormBuilder, Validators, NgForm, NgClass} from 'angular2/common';
import {CustomValidator} from '../../yourServices/validatorService';

под классом определить

 demoForm: ControlGroup;
constructor( @Inject(FormBuilder) private Fb: FormBuilder ) {
    this.demoForm = Fb.group({
       spec: new Control('', Validators.compose([Validators.required,   CustomValidator.specialCharValidator])),
      })
}

в разделе {../../yourServices/validatorService.ts}

export class CustomValidator {
    static specialCharValidator(control: Control): { [key: string]: any } {
   if (control.value) {
       if (!control.value.match(/[-!$%^&*()_+|~=`{}\[\]:";#@'<>?,.\/]/)) {            
           return null;
       }
       else {            
           return { 'invalidChar': true };
       }
   }

 }

 }
person mani R    schedule 21.06.2016

Мое решение с Angular 4.0.1: просто показываю пользовательский интерфейс для требуемого ввода CVC - где CVC должен состоять ровно из трех цифр:

    <form #paymentCardForm="ngForm">         
...
        <md-input-container align="start">
            <input #cvc2="ngModel" mdInput type="text" id="cvc2" name="cvc2" minlength="3" maxlength="3" placeholder="CVC" [(ngModel)]="paymentCard.cvc2" [disabled]="isBusy" pattern="\d{3}" required />
            <md-hint *ngIf="cvc2.errors && (cvc2.touched || submitted)" class="validation-result">
                <span [hidden]="!cvc2.errors.required && cvc2.dirty">
                    CVC is required.
                </span>
                <span [hidden]="!cvc2.errors.minlength && !cvc2.errors.maxlength && !cvc2.errors.pattern">
                    CVC must be 3 numbers.
                </span>
            </md-hint>
        </md-input-container>
...
<button type="submit" md-raised-button color="primary" (click)="confirm($event, paymentCardForm.value)" [disabled]="isBusy || !paymentCardForm.valid">Confirm</button>
</form>
person mkaj    schedule 10.04.2017