指定多个事件以触发StringValidator?

时间:2013-10-07 23:10:18

标签: actionscript-3 flash flex events

我想使用TextInput验证Flex StringValidator。我发现我可以这样做:

<mx:StringValidator source="{myTextInput}"
                    property="text"
                    triggerEvent="{TextEvent.TEXT_INPUT}"/>

但是,我想不仅在textInput event上,而且在focusOut event上验证文字。

                    triggerEvent="{FocusEvent.FOCUS_OUT}"
                    triggerEvent="{TextEvent.TEXT_INPUT}"/>

但是,像这样重新定义triggerEvent两次是非法的。是否可以根据多个不同的事件触发StringValidator

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

mxml代码

    <mx:StringValidator source="{myTextInput}" property="text"
        triggerEvent="validateInput"/>

    <mx:TextInput id="myTextInput" 
             textInput="inputEvent(event)" 
             focusOut="inputEvent(event)"/>

处理程序

    private function inputEvent(event:*):void {
     dispatchEvent(new Event("validateInput"));
}

其他变体

处理程序

    private function inputEvent(event:*):void {             
    myValidator.validate();
}

MXML

    <mx:StringValidator id="myValidator" source="{myTextInput}" property="text"/>

答案 1 :(得分:0)

您可以将两个验证器附加到同一个字段。 唯一的问题是有些情况下可以触发这两个事件。 例如,如果您在文本输入时显示弹出窗口,那么也会聚焦。

这是一个有效的例子:

<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.events.ValidationResultEvent;

                protected function stringvalidator1_validHandler(event:ValidationResultEvent):void
                {
                    trace("Validated testInput");                   
                }

                protected function stringvalidator1_invalidHandler(event:ValidationResultEvent):void
                {
                    trace("Invalidated testInput");                 

                }
                protected function stringvalidator2_validHandler(event:ValidationResultEvent):void
                {
                    trace("Validated focusOut");                    
                }

                protected function stringvalidator2_invalidHandler(event:ValidationResultEvent):void
                {
                    trace("Invalidated focusOut");                  

                }


            ]]>
    </fx:Script>

    <fx:Declarations>
        <mx:StringValidator source="{fname}" minLength="4" maxLength="20"
                            property="text" valid="stringvalidator1_validHandler(event)" 
                            invalid="stringvalidator1_invalidHandler(event)"
                            triggerEvent="{TextEvent.TEXT_INPUT}"/>
        <mx:StringValidator source="{fname}" minLength="4" maxLength="20"   
                            property="text" valid="stringvalidator2_validHandler(event)" 
                            invalid="stringvalidator2_invalidHandler(event)"
                            triggerEvent="{FocusEvent.FOCUS_OUT}"/>

    </fx:Declarations>

    <s:Panel title="StringValidator Example"
             width="75%" height="75%"
             horizontalCenter="0" verticalCenter="0">
        <mx:Form left="10" right="10" top="10" bottom="10">
            <mx:FormItem label="Enter a name between 4 and 20 characters: ">
                <s:TextInput id="fname" width="100%"/>
            </mx:FormItem>
        </mx:Form>
    </s:Panel>

</s:Application>

答案 2 :(得分:0)

验证器仅附加一个触发事件。如果要触发更多事件,则必须添加更多验证器,其中源是相同的字段,但您更改了eventTrigger属性。

所以,你有:

<mx:StringValidator source="{myTextInput}"
property="text"
triggerEvent="{TextEvent.TEXT_INPUT}"/>

<mx:StringValidator source="{myTextInput}"
property="text"
triggerEvent="{FocusEvent.FOCUS_OUT}"/>.

恕我直言,我只在focusOut上添加一个验证器,所以你让免费用户写下每个人的情节,但当你离开控件时,你会做所有的检查和验证。

答案 3 :(得分:0)

TextEvent.TEXT_INPUT无法检测退格并删除关键事件。请改用Event.CHANGE。