Отправка пользовательских событий из валидатора - PullRequest
1 голос
/ 02 августа 2011

У меня есть вопрос, который, как мы надеемся, будет для кого-то довольно простым. В основном я пытаюсь создать строку Validator, которая запрашивает новый язык у своего контроллера, отправляя событие при его создании.

Пример ниже представляет собой прямую копию из проводника компонентов Flex3 - единственное отличие состоит в том, что я создал валидатор как пользовательский компонент, который отправляет событие при его создании.

Проблема в том, что мое основное приложение не может услышать отправляемое событие, и я не знаю почему.

Вот пример

MyValidator.as

        package components 
{
    import flash.events.Event;
    import mx.validators.StringValidator;

    /**
     * ...
     * @author Beaker
     */
    public class MyValidator extends StringValidator 
    {

        public function MyValidator() 
        {
            trace(">>MyValidator:MyValidator--")
            var _event:Event = new Event("getLanguage", true)
            dispatchEvent(_event)
        }

    }

}

Main.MXML

    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:comp="components.*" creationComplete="onComplete(event)">
     <mx:Script>
         <![CDATA[
                    import flash.events.Event;
                    import mx.controls.Alert;
                    protected function onComplete(evt:Event):void 
                    {
                        trace(">>Main:onComplete--")
                        systemManager.addEventListener("getLanguage",onTest)
                    }
                    protected function onTest(evt:Event):void 
                    {
                        trace(">>Main:onTest--")
                        Alert.show("getLanguage");
                    }
         ]]>

    </mx:Script>

    <comp:MyValidator source="{fname}" 
        property="text" 
        tooShortError="This string is shorter than the minimum allowed length of 4. " 
        tooLongError="This string is longer than the maximum allowed length of 20." 
        minLength="4" maxLength="20"  
        trigger="{myButton}" triggerEvent="click" 
        valid="Alert.show('Validation Succeeded!');"/>

    <mx:Panel title="StringValidator Example" width="75%" height="75%" 
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">

            <mx:Form>               
                <mx:FormItem label="Enter a name between 4 and 20 characters: ">
                    <mx:TextInput id="fname" width="100%"/>
                </mx:FormItem>

                <mx:FormItem >
                    <mx:Button id="myButton" label="Validate" />
                </mx:FormItem>
            </mx:Form>  
    </mx:Panel>

</mx:Application>

Простите за форматирование, если оно не отображается правильно!

1 Ответ

3 голосов
/ 02 августа 2011

Ваш MyValidator не DisplayObject, поэтому его события не всплывают. Вы должны добавить слушателей непосредственно к MyValidator instance.

Вариант № 1:

<comp:MyValidator source="{fname}" 
        property="text"
        id="validator"
        tooShortError="This string is shorter than the minimum allowed length of 4. " 
        tooLongError="This string is longer than the maximum allowed length of 20." 
        minLength="4" maxLength="20"  
        trigger="{myButton}" triggerEvent="click" 
        valid="Alert.show('Validation Succeeded!');"/>

и

validator.addEventListener("getLanguage", onTest);

Вариант № 2:

В MyValidator.as добавить следующие метаданные перед объявлением класса:

[Event(name="getLanguage", type="flash.events.Event")]

и использование:

<comp:MyValidator source="{fname}" 
        property="text"
        getLanguage="onTest(event)"
        tooShortError="This string is shorter than the minimum allowed length of 4. " 
        tooLongError="This string is longer than the maximum allowed length of 20." 
        minLength="4" maxLength="20"  
        trigger="{myButton}" triggerEvent="click" 
        valid="Alert.show('Validation Succeeded!');"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...