J'écris actuellement un formulaire simple en ionic 2 (Angular 2). Je me demandais comment j'ajouterais un modèle simple expression régulière à la validation:
J'ai essentiellement ceci:
<form>
<ion-input stacked-label>
<ion-label>{{label.msisdn}}</ion-label>
<input type="text"
[(ngModel)]="msisdn"
ngControl="msisdnForm"
required
maxlength="10"
minlength="10"
pattern="06([0-9]{8})"
#msisdnForm="ngForm"
>
</ion-input>
<button [disabled]="!msisdnForm.valid" block (click)="requestActivationCode()">
{{label.requestActivationCode}}
</button>
</form>
La longueur maximale, la longueur minimale et la valeur requise sont récupérées (le bouton est désactivé si les conditions ne sont pas remplies). Maintenant, je veux limiter l'entrée à numérique et le préfixer avec 06 (numéro de téléphone néerlandais avec un nombre minimum de numéros).
Le motif n'est cependant pas repris dans la validation. Puis-je le faire de cette façon ou ai-je besoin d'une approche de code?
Ajouter le motif à une variable
var pattern=/06([0-9]{8})/;
et y lier l'attribut
<input type="text"
[(ngModel)]="msisdn"
ngControl="msisdnForm"
required
maxlength="10"
minlength="10"
[pattern]="pattern"
#msisdnForm="ngForm"
>
Il semble que ce PR https://github.com/angular/angular/pull/6623/files doit atterrir en premier.
Il y a toujours un problème ouvert https://github.com/angular/angular/issues/7595 Cela empêche pattern
d'être lié à. Le modèle doit être ajouté statiquement au DOM (sans liaison) pour fonctionner.
Je mets plus de détails (Angular 2.0.8 - 3 mars 2016): https://github.com/angular/angular/commit/38cb526
Exemple de repo:
<input [ngControl]="fullName" pattern="[a-zA-Z ]*">
Je l'ai testé et cela a fonctionné :) - 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'>
MISE À JOUR septembre 2017
Je veux juste dire qu'actuellement, quand j'ai plus d'expérience, j'utilise généralement l'approche "bon marché" de la validation des données:
La validation est UNIQUEMENT côté serveur (pas dans angular du tout!) Et si quelque chose ne va pas, le serveur (API Restful) renvoie un code d'erreur, par exemple HTTP 4 et suivants objet json dans le corps de la réponse (que dans angular 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, vous pouvez généralement le mapper facilement à la structure ci-dessus)
Dans le modèle html, j'utilise une balise 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 de "capacité", le tag avec la traduction d'erreur (dans la langue de l'utilisateur) sera visible. Cette approche présente les avantages suivants:
<small>
)Bien sûr, parfois (si cela est nécessaire - par exemple, le champ retypePassword qui n'est jamais envoyé au serveur), je fais des exceptions de l'approche ci-dessus et j'effectue une validation dans angular (mais utilisez un "this.err
"mécanisme pour afficher les erreurs (donc je n'utilise pas l'attribut pattern
directement dans la balise input
mais je fais plutôt une validation regexp dans une méthode de composant après que l'utilisateur a déclenché l'événement approprié comme input-change ou save) .