让我尽力解释这一点。
我有一个包含数据网格的组件,其中包含以下数据网格列
<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>
方法
答案 0 :(得分:1)
添加事件侦听器时,必须将其添加到触发事件的类中。在您的代码中,您将它添加到包含DataGrid的组件中。 itemRenderer,DataGrid和包含DataGrid的组件都不会触发事件。
如果包含DataGrid的组件可以访问ContactVO事件,则可以直接侦听它。
否则,您可以在itemRenderer中添加事件侦听器。
如果您绝对需要在包含DataGrid的组件中执行代码,那么itemRenderer应该侦听事件的Value Object,然后触发它自己的事件。确保'itemRenderer'事件冒泡;它将向上移动显示层次结构。