Flex Validator: Déclencher la validation en MXML et ActionScript
Pour être lancé, un Validator doit d'abord être déclenché (triggered). Le trigger (déclencheur) par défaut pour un validateur est l'événement valueCommit, qui est dispatché par l'objet référencé comme "source" du validateur. La plupart du temps, cette valeur est appropriée car l'événement valueCommit est envoyé par tous les contrôles de type input quand la valeur est fixé de manière programmatique ou lorsque l'on enlève le focus d'un contrôle (clic à l'extérieur).
Cependant, vous pourriez vouloir changer la manière dont est déclenchée la validation. Par exemple, même si on pense tout de suite à utiliser un contrôle de type input pour être validé, vous voudriez peut-être utiliser un autre type de contrôle ou de propriété. Si le type d'objet que vous utilisez ne propage pas d'événements valueCommit, la validation ne sera jamais déclenchée. Un autre scénario plus probable serait que vous voudriez que la validation se fasse lorsque l'utilisateur clique sur un bouton, et non pas quand il sort le focus du contrôle.
Les deux propriétés d'un Validator que vous pouvez utiliser pour changer le déclencheur sont "trigger" et "triggerEvent". La propriété "trigger" a besoin d'un référence vers l'objet que vous voulez utiliser comme déclencheur. La propriété triggerEvent a besoin du nom de l'événement que vous voulez utiliser pour déclencher le validateur.
L'exemple suivant utilise l'événement "click" du bouton pour déclencher la validation:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">
<mx:Form>
<mx:FormHeading label="Formulaire Simple"/>
<mx:FormItem id="userNameItem" label="Nom">
<mx:TextInput id="username"/>
</mx:FormItem>
<mx:FormItem>
<mx:Button id="button" label="Valider"/>
</mx:FormItem>
</mx:Form>
<mx:Validator id="validator" source="{username}" property="text" trigger="{button}" triggerEvent="click"/>
</mx:Application>
Flex Source Code Download: Télécharger le code source complet de l'application
Vous pouvez avoir plus de contrôle sur quand et comment vous voulez lancer les validateurs en utilisant de l'ActionScript. Tous les Validator ont une méthode validate() permettant de lancer la validation. Pour appeler cette méthode, il faut que votre validator ait une propriété id.
Vous devez fixer la propriété "trigger" du Validator à "null" pour que la validation ne se fasse pas et ainsi le déclencher en ActionScript.
La méthode validate() ne fait pas que de valider la donnée, elle renvoie aussi un objet de type ValidationResultEvent, qui vous indique si la validation s'est bien passée. La propriété "type" de cet objet est soit valid ou invalid (pour lesquelles vous pouvez utiliser les constantes ValidationResultEvent.VALID et ValidationResultEvent.INVALID). L'exemple suivant utilise la méthode validate() pour afficher une Alert lorsque l'utilisateur clique sur le bouton mais ne remplit pas un champ requis.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.events.ValidationResultEvent;
import mx.controls.Alert;
private function runValidators(event:Event):void{
// lance la validation, grâce à la méthode validate() et assigne le résultat
// à une variable
var validationResultEvent:ValidationResultEvent = validator.validate(null, true);
// si le résultat de la validation est incorrect,
// on affiche une Alert
if (validationResultEvent.type == ValidationResultEvent.INVALID){
Alert.show("Veuillez spécifier une valeur");
}
}
]]>
</mx:Script>
<mx:Form>
<mx:FormHeading label="Formulaire Simple"/>
<mx:FormItem id="userNameItem" label="Nom">
<mx:TextInput id="username"/>
</mx:FormItem>
<mx:FormItem>
<mx:Button id="button" label="Valider" click="runValidators(event)"/>
</mx:FormItem>
</mx:Form>
<mx:Validator id="validator" source="{username}" property="text" trigger="{null}"/>
</mx:Application>
Flex Source Code Download: Télécharger le code source complet de l'application
Lorsque vous travaillez avec plus d'un Validator, et que vous voulez appelez la méthode validate() de chacun, vous pouvez appeler la méthode validate() de chacun ou utiliser la méthode static validateAll() de la classe Validator. La méthode validateAll() prend un tableau en paramètre dont tous les éléments sont des objets validator. La méthode validateAll() retourne un tableau avec tous les objets ValidationResultEvent retournés par les validateurs qui ne sont pas valides. Si toutes les validations sont passées, le tableau est vide. L'exemple suivant utilise 4 validateurs. Quand l'utilisateur clique sur le bouton, le bouton propage un événement appelant une fonction qui lance validateAll(), et affiche une Alert indiquant à l'utilisateur quels champs n'ont pas été validés.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="initializeHandler(event)"
viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.events.ValidationResultEvent;
import mx.controls.Alert;
import mx.validators.Validator;
private var _validators:Array;
private function initializeHandler(event:Event):void{
// crée un tableau avec tous les validators
_validators = [usernameValidator, phoneValidator, emailValidator, zipcodeValidator];
}
private function runValidators(event:Event):void{
// déclenche tous les validateurs
var results:Array = Validator.validateAll(_validators);
// si le tableau est vide, tout s'est bien passé
// sinon, au moins un des validateurs n'est pas passé
if (results.length > 0){
var message:String = "Les champs suivant sont incorrects:\n";
//boucle sur les résultats et retrouve l'id correspondant
for (var i:uint = 0;i<results.length;i++){
message += results[i].target.source.id + "\n";
}
Alert.show(message);
}
}
]]>
</mx:Script>
<mx:Form>
<mx:FormHeading label="Formulaire Simple"/>
<mx:FormItem id="userNameItem" label="Nom">
<mx:TextInput id="username"/>
</mx:FormItem>
<mx:FormItem label="Téléphone">
<mx:TextInput id="phone"/>
</mx:FormItem>
<mx:FormItem label="Email">
<mx:TextInput id="email"/>
</mx:FormItem>
<mx:FormItem label="Code Postal">
<mx:TextInput id="zipcode"/>
</mx:FormItem>
<mx:FormItem>
<mx:Button id="button" label="Valider tous les champs" click="runValidators(event)"/>
</mx:FormItem>
</mx:Form>
<mx:Validator id="usernameValidator" source="{username}" property="text"/>
<mx:PhoneNumberValidator id="phoneValidator" source="{phone}" property="text"/>
<mx:EmailValidator id="emailValidator" source="{email}" property="text"/>
<mx:ZipCodeValidator id="zipcodeValidator" source="{zipcode}" property="text"/>
</mx:Application>
Flex Source Code Download: Télécharger le code source complet de l'application
Articles similaires
- Flex Validator: Récupérer les événements d'un Validator
- Flex Formatter: Exemple de PhoneFormatter en MXML
- Flex Validator: Exemple de EmailValidator en MXML et ActionScript
- Flex Validator: Exemple de PhoneNumberValidator en MXML et ActionScript
- Flex Validator: Création de Validator en MXML (mx:Validator) et AS
Aucun trackbacks pour l'instant






13 juillet 2008
Bonjour,
J' ai deux variables et je souhaite nommer la second avec le string de l'autre
[Bindable]
public var ref:String = "AZ48";
[Bindable]
public var piece:String = "porte";
[Bindable]
public var [AZ48] = piece // puis un truc du genre
Pouvez-vous m'aider, car je suis perdu.
Merçi
16 juillet 2008
Salut,
tu peux conserver des valeurs de ce types dans des objets (de type Object) ou bien un tableau (Array) qui va référencer tes variables par leur propriété ref.
Voila un exemple de code avec un Array associatif que j'ai fait:
public var ref:String = "AZ48";
public var piece:String = "porte";
public var refArray:Array = new Array;
public function traceFct():void{
refArray[ref] = piece; // assigner la référence dans le tableau
trace ("trace: "+refArray["AZ48"]); // renvoie "porte"
}
J'espère que c'est ce que tu voulais
Fabien
26 février 2009
Bonjour,
( J'espère poser mon problème au bon endroit. )
Alors tout d'abord merci pour tous ces tutos hyper complets.
J'ai une application avec une interface de login et plusieurs champs à saisir.
Au moment de l'envoi du formulaire au serveur, j'effectue une validation basique des champs via une méthode très similaire à celle que vous proposez.
Mon problème est que le pop-up indiquant les champs erronés est affiché "derrière" mon formulaire de login.
La où les choses deviennent mystérieuses, c'est que j'ai d'autres pop-up qui s'affichent en fonction des résultats renvoyés par le serveur et ceux-là s'affichent bien "devant" mon formulaire.
Je pense que cela viens de la méthode de validation qui, au moment de mettre les champs incorrect en "rouge", redonne le focus au compo de login et donc il repasse au premier plan.
auriez-vous des suggestions à me proposer ?
26 février 2009
Salut,
pour ouvrir une pop-up, vous utilisez Alert ou bien le PopUpManager ? je pense qu'il s'agit seulement d'un problème de définition du parent de la popup. Si vous utilisez le composant Alert avec la méthode show, c'est le 4e paramètre:
http://livedocs.adobe.com/flex/3/langref/index.html (classe Alert)
Voila, il faut peut etre regarder de ce côté la
Fabien
26 février 2009
hello,
J'aurais dû préciser que j'utilise une classe développée spécialement pour l'application et qui (en théorie) est indépendante de l'élément qui l'appelle.
C'est pour cela que je suppose qu'après l'affichage du pop-up , un "événement" (pas un event) redonne le focus à mon compo de login.
En tout cas, merci pour la rapidité de la reponse
26 février 2009
Que tu utilise le PopUpManager ou Alert, ta popup est toujours dépendante d'une élément qui est son parent (celle par rapport à qui elle va se placer/centrer). Après, faudra que je comprenne la différence entre un évènement et un event ^^
27 février 2009
Bon, je m'etais mal exprimé avec cette histoire d'evênement / events, on mettra ça sur le compte de la privation de sommeil.
Finalement, la solution étais de bloquer la propagation de l'evenement "click" (event.stopPropagation() ) afin de laisser le focus au pop-up.
Merci pour les pistes de recherche.
30 juin 2009
Bonjour,
J'ai repris l'idée d'Adobe pour créer un zipCodeValidator français !
Vous pouvez trouver les sources sur http://vilox.fr/pages/projects.php
N'hésitez pas à me donner vos retours et même à étendre l'idée en ajoutant le format Belge, Espagnol, Turc ...
6 octobre 2010
Bonjour, j'ai une petite question sur l'utilisation de plusieurs validateurs sur un formulaire complexe.
Peut on associer un même validateur à plusieurs champs :
J'ai plusieurs champs (un nom et un prénom) qui sont identique en terme de validation. (l'attribut source de mon StringValidator peut il désigner plusieurs champs ?).
Une idée ? merci d'avance ...
6 octobre 2010
Bonjour,
ce n'est pas possible de base, non. Mais avec une petite factory de validateurs, vous pouvez en créer autant que vous souhaitez. Il y a toujours une solution
Fabien
7 octobre 2010
Ok, merci pour la réponse