捕获组件中的值对象生成的事件

时间:2011-07-14 15:20:11

标签: flex events

让我尽力解释这一点。

我有一个包含数据网格的组件,其中包含以下数据网格列

        <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语句,我可以看到在执行验证时值从对象触发并且值发生了变化,但是{{1}永远不会被调用,所以我认为事件永远不会进入我的组件。

知道我在这里犯了什么错吗?谢谢!

[溶液]

下面与@Flextras的对话有助于加深我对这个过程的理解,并找出我的理解中断开的位置。基本上,我将组件数据列条目的内部更改为以下内容:

processContactChange

并从我的 <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> 方法

中删除了事件监听器

1 个答案:

答案 0 :(得分:1)

添加事件侦听器时,必须将其添加到触发事件的类中。在您的代码中,您将它添加到包含DataGrid的组件中。 itemRenderer,DataGrid和包含DataGrid的组件都不会触发事件。

如果包含DataGrid的组件可以访问ContactVO事件,则可以直接侦听它。

否则,您可以在itemRenderer中添加事件侦听器。

如果您绝对需要在包含DataGrid的组件中执行代码,那么itemRenderer应该侦听事件的Value Object,然后触发它自己的事件。确保'itemRenderer'事件冒泡;它将向上移动显示层次结构。