Comment ajouter un modèle de validation de formulaire en Angular 2?
j'ai un formulaire simple qui doit valider si le début et la fin de l'entrée n'est pas l'espace.
En HTML5, je vais faire ceci:
<input type="text" pattern="^(?!s|.*s$).*$">
Quelle est la bonne propriété pour le motif de validation dans la nouvelle directive Angular 2 ngControl? L'API bêta officielle manque encore de documentation sur cette question.
5 réponses
Maintenant, vous n'avez pas besoin d'utiliser FormBuilder
et tous ces trucs compliqués d'angle de valiation. J'ai mis plus de détails de ceci (Angular 2.0.8 - 3march2016):
https://github.com/angular/angular/commit/38cb526
Exemple de repo :
<input [ngControl]="fullName" pattern="[a-zA-Z ]*">
je l'ai tester et ça fonctionne :) - voici mon code:
<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'>
UPDATE June 2017
je veux juste dire qu'actuellement, lorsque j'ai plus d'expérience, je usally utilisation suivant l'approche "bon marché" de la validation des données:
la Validation est seulement du côté du serveur (pas du tout angulaire!) et si quelque chose ne va pas, alors server (Restful API) renvoie un code d'erreur E. g HTTP 400 et suivant l'objet json dans le corps de réponse (que dans l'angle je mets à err
variable):
this.err = {
"capacity" : "too_small"
"filed_name" : "error_name",
"field2_name" : "other_error_name",
...
}
(si le serveur renvoie une erreur de validation dans un format différent, alors vous pouvez facilement l'associer à la structure ci-dessus)
dans le modèle html j'utilise une étiquette séparée (div/span / small etc.)
<input [(ngModel)]='room.capacity' ...>
<small *ngIf="err.capacity" ...>{{ translate(err.capacity) }}</small>
comme vous le voyez, lorsqu'il y a une erreur dans 'capacity', alors tag with error translation (to user language) sera visible. Cette approche ont des avantages suivants:
- c'est très simple
- en angle, Nous ne doublons pas le code de validation qui est (et doit être) dans le serveur (dans le cas de la validation regexp, cela peut empêcher ou compliquer ReDoS attaques)
- nous avons le plein contrôle sur la façon dont l'erreur sera affiché à l'utilisateur (ici comme egzample
<small>
la balise - parce que dans la réponse du serveur, nous revenons error_name (au lieu du message d'erreur direct), nous pouvons facilement changer le message d'erreur (ou le traduire) en modifiant seulement le code frontend-angulaire (ou les fichiers avec des traductions). Donc, dans ce cas, nous n'avons pas besoin de toucher le code d'arrière-plan/serveur.
bien sûr, parfois (si cela est nécessaire - par exemple. champ retypePassword qui n'est jamais envoyé pour le serveur) je fais des exceptions de l'approche ci-dessus et de faire la validation de certains angulaire (mais similaires,"this.err
" mécanisme pour montrer les erreurs (donc je n'utilise pas pattern
l'attribut directement dans input
tag mais plutôt je fais la validation regexp dans une méthode component après que l'utilisateur élève l'événement approprié comme input-change ou save) .
Depuis la version 2.0.0-bêta.8 (2016-03-02), L'angle inclut maintenant un Validators.pattern
validateur regex.
voir le CHANGELOG
vous pouvez construire votre formulaire en utilisant FormBuilder car il vous permet une manière plus flexible de configurer le formulaire.
export class MyComp {
form: ControlGroup;
constructor(@Inject()fb: FormBuilder) {
this.form = fb.group({
foo: ['', MyValidators.regex(/^(?!\s|.*\s$).*$/)]
});
}
Puis dans votre template :
<input type="text" ngControl="foo" />
<div *ngIf="!form.foo.valid">Please correct foo entry !</div>
vous pouvez aussi personnaliser la classe ng-invalid css.
comme il n'y a en fait aucun validateur pour regex, vous devez écrire le vôtre. C'est une fonction simple qui prend un contrôle en entrée, et renvoie null si valide ou StringMap si invalide.
export class MyValidators {
static regex(pattern: string): Function {
return (control: Control): {[key: string]: any} => {
return control.value.match(pattern) ? null : {pattern: true};
};
}
}
J'espère que ça vous aidera.
validation personnalisée, étape par étape
modèle 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>
Composant D'Application.ts
import {Control, ControlGroup, FormBuilder, Validators, NgForm, NgClass} from 'angular2/common';
import {CustomValidator} from '../../yourServices/validatorService';
le cadre de la classe définir
demoForm: ControlGroup;
constructor( @Inject(FormBuilder) private Fb: FormBuilder ) {
this.demoForm = Fb.group({
spec: new Control('', Validators.compose([Validators.required, CustomValidator.specialCharValidator])),
})
}
{../../ your services / 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 };
}
}
}
}
Ma solution Angulaire 4.0.1: il suffit de montrer l'INTERFACE utilisateur pour les CVC entrée - où le CCF doit être exactement 3 chiffres:
<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>