2010-10-21 9 views
0

Quel événement TextInput puis-je écouter pour lancer une alerte lorsqu'un numéro est entré? Le scénario est: un utilisateur entre un nombre dans myTxt1. Une alerte apparaît, indiquant "Êtes-vous sûr de vouloir entrer ce numéro?". Si l'utilisateur clique sur Oui, ne rien faire/continuer. Si l'utilisateur clique sur Non, laissez le focus sur myTxt1 afin qu'il puisse changer le numéro.Comment confirmer la saisie de texte dans Flex actionscript

Le problème est, je ne sais pas quel événement écouter pour lancer l'alerte. J'ai essayé valueCommit et focusOut. Avec ces deux éléments, l'alerte s'affiche, mais lorsque l'utilisateur clique sur Oui, le focus reste sur myTxt1, même si l'événement a été déclenché par l'utilisateur qui a cliqué sur myTxt2. L'utilisateur essaie de quitter myTxt1, mais voit l'ALert, clique sur Oui, le focus reste sur myTxt1, et c'est un cercle vicieux.

Cela semble être un problème simple, mais je ne peux pas le comprendre. Aucun conseil?

Répondre

1

Dans votre gestionnaire focusOut, vous devez stocker l'objet qui va obtenir le focus. En effet, lorsque vous affichez une alerte, cette information est supprimée car la fenêtre d'alerte obtient désormais le focus. Voir l'exemple suivant sur la façon de le faire correctement. Je vous suggère de construire votre propre composant personnalisé qui fait tout le travail pour vous ...

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.events.CloseEvent; 
      import mx.managers.FocusManager; 

      protected var previousValue:String; 
      protected var nextValue:String; 
      protected var focusInObject:InteractiveObject; 

      protected function isNumber(value:String):Boolean 
      { 
       // do your check 
       return true; 
      } 

      protected function textInput_focusOutHandler(event:FocusEvent):void 
      { 
       var value:String = TextInput(event.currentTarget).text; 

       if (!isNumber(value) || value == previousValue) 
        return; 

       nextValue = value; 
       focusInObject = event.relatedObject; 
       Alert.show("Are you sure you want to enter that number?", "", Alert.YES | Alert.NO, this, alertCloseHandler); 
      } 

      protected function alertCloseHandler(event:CloseEvent):void 
      { 
       if (event.detail == Alert.NO) 
        return; 

       previousValue = nextValue; 

       if (focusInObject) 
        systemManager.stage.focus = focusInObject; 
      } 
     ]]> 
    </fx:Script> 

    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 

    <s:TextInput focusOut="textInput_focusOutHandler(event)"/> 

    <s:CheckBox label="Foo"/> 
    <s:Button label="Bar"/> 
</s:Application> 

J'ai inclus une petite optimisation. L'application mémorise la valeur si l'utilisateur appuie sur Oui. Si vous obtenez un autre événement focusOut et que la valeur n'a pas changé depuis la dernière fois, l'alerte ne sera pas affichée.

+0

Merci Gerhard! C'est exactement la solution que je recherche, mais (gros mais), je ne peux pas le faire fonctionner avec mon code. J'ai un certain nombre de contrôles TextInput que l'utilisateur va tabuler ou cliquer pour entrer une série de nombres. Lorsque j'ajoute un autre TextInput à votre code, puis entrez un nombre dans le premier et cliquez sur le second, je rencontre un problème dans le focusOutHandler. Je regarde la ligne 'focusInObject = ...' Bien que event.relatedObject soit satisfaisant, focusInObject est défini sur null.Il semble y avoir un problème pour attacher l'interface IFocusManagerComponent à un TextInput – Carrie

+0

Connaissez-vous une solution de contournement? code avec lequel je travaille (édité un peu pour que je puisse l'utiliser en tant qu'application Flex) – Carrie

+0

Désolé, je ne peux pas coller dans mon code bc c'est trop long, mais je viens d'ajouter un second TextInput après le premier – Carrie

2

Si vous essayez d'empêcher l'utilisateur de saisir des numéros ou d'envisager d'utiliser la propriété restrict. Mais si vous souhaitez simplement que l'utilisateur soit averti de la saisie d'un numéro, vous pouvez utiliser l'événement change.

0

Vous pouvez écouter l'événement change s'il s'agit d'un composant TextArea. S'il y a un changement dans la zone de texte, un événement de changement sera déclenché. Vous pouvez ensuite vérifier quelle touche est enfoncée.

Questions connexes