Событие захвата, созданное объектом-значением в компоненте - PullRequest
0 голосов
/ 14 июля 2011

Позвольте мне попытаться объяснить это как можно лучше.

У меня есть компонент, содержащий сетку данных со следующим столбцом сетки данных

        <mx:DataGridColumn dataField="email" headerText="Email Address">
            <mx:itemRenderer>
                <mx:Component>
                    <mx:VBox width="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off" horizontalAlign="center">
                        <mx:TextInput id="tiEmailAddress" 
                                                width="95%"
                                                text="{data.email}"
                                                invalid="{data.isNotValidEmail(event);}"
                                                valid="{data.isValidEmail(event);}"/>
                        <mx:EmailValidator id="validatorEmailAddress"
                                      source="{tiEmailAddress}"
                                      property="text"
                                      required="true"
                                      requiredFieldError="Email address is required."/>
                    </mx:VBox>
                </mx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>

Вот смелость моего ценностного объекта:

[Bindable(event="contactChange")]
public class ContactVO extends EventDispatcher
{
    private var _email:String = "default email";

    public var selected:Boolean = false;
    public var edited:Boolean = false;
    public var isNew:Boolean = false;
    public var isValid:Boolean = false;


    public function ContactVO()
    {       }


    public function isNotValidEmail(e:Event):void
    {
        isValid = false;
        email = e.target.text;          
    }


    public function isValidEmail(e:Event):void
    {
        isValid = true;
        email = e.target.text;
    }


    public function get email():String   
    {                       
        return _email;
    }             


    public function set email(value:String) : void 
    {                       
        if (value != _email) {
            _email = value;
            edited = true;
        }
        dispatchEvent(new Event("contactChange", true));
    }

}

Затем вернемся к компоненту, у меня есть это, которое вызывается в creationComplete

addEventListener("contactChange", processContactChange);

Через отладчик Flex я вижу оператор addEventListener, вызываемый при создании компонента, я вижу событие, которое запускается из объекта значения при выполнении проверки и изменении значения, но processContactChange никогда не вызывается , поэтому я предполагаю, что событие никогда не попадает в мой компонент.

Есть идеи, что я здесь ошибся? Спасибо!

[РЕШЕНИЕ]

Разговор с @Flextras, приведенный ниже, помог углубить мое понимание этого процесса и выяснить, где разрыв был в моем понимании. По сути, я изменил внутреннюю часть записи в столбце данных моего компонента на следующую:

                        <mx:TextInput id="tiEmailAddress" 
                                                width="95%"
                                                text="{data.email}"
                                                invalid="{data.isNotValidEmail(event);}"
                                                valid="{data.isValidEmail(event);}"
                                                creationComplete="{addListener(data)}"/>
                        <mx:Script>
                            <![CDATA[
                                private function addListener(data:Object):void
                                {
                                    var eventDispatcher:EventDispatcher = data as EventDispatcher;
                                    eventDispatcher.addEventListener("contactChange", outerDocument.processContactChange);
                                }
                            ]]>
                        </mx:Script>

и удалил прослушиватель событий из моего creationComplete метода

1 Ответ

1 голос
/ 14 июля 2011

Когда вы добавляете прослушиватель событий, вы должны добавить его в класс, который запускает событие. В своем коде вы добавляете его в компонент, содержащий DataGrid. Ни itemRenderer, DataGrid, ни компонент, содержащий DataGrid, не запускают событие.

ЕСЛИ компонент, содержащий DataGrid, имеет доступ к событию ContactVO, вы можете прослушать его непосредственно.

В противном случае вы можете добавить прослушиватель событий в свой itemRenderer.

Если вам абсолютно необходимо выполнить код в компоненте, содержащем DataGrid, то itemRenderer должен прослушать объект Value для события, а затем запустить собственное событие. Убедитесь, что событие itemRenderer вспыхивает; и он будет двигаться вверх по иерархии отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...