这些是同一应用程序下的脚本,第一个是应用程序,第二个是在dataGrid下。从第一个脚本到outerClick()我正在访问itemrenderer中的inner()函数。我可以通过outerDocument对象从innerClick()轻松访问函数outer(),但是可以从outerClick()函数访问itemrenderer中的inner()函数what_to_use。我尝试使用mx:component id""还有class =""但它无法识别itemrenderer下的函数。
<mx:Script>
<![CDATA[
public function outer():void{
Alert.show("Hi i am outer object");
}
public function outerClick():void{
what_to_use.inner();
}
]]>
</mx:Script>
以下项目在数据网格下呈现。
<s:itemRenderer>
<mx:Component>
<s:GridItemRenderer>
<fx:Script>
<![CDATA[
public function innerClick():void{
outerDocument.outer();
}
public function inner():void{
Alert.show("Hi i am inner");
}
]]>
</fx:Script>
<s:CheckBox id="sel" selected="{data.checked=sel.selected}" change="{data.checked}" click="innerClick()"/>
</s:GridItemRenderer>
</mx:Component>
</s:itemRenderer>
答案 0 :(得分:3)
如果我们可以通过使用从渲染项访问外部函数 “outerdocument”对象然后我们无法访问内部函数 外部。?
您似乎对itemRenderers有什么明显的误解。 itemRenderer是一个组件定义,有点像创建自己的类。因为您正在使用'outerDocument'引用,所以您将在另一个类中创建自己的内联/嵌入类。
为基于List的类中的每个可见项创建自定义itemRenderer类的实例;所以你自己的类被多次创建,这意味着你的itemRenderer函数有多个实例。 Flex如何知道您要调用哪个itemRenderer实例?事实上它不能。
这就是为什么你可以打电话,但你不能打电话。
如果您需要在itemRenderer中进行更改,则应该通过更改dataProvider的数据元素来进行更改。
对于所有意图和目的,我建议不要使用outerDocument。封装是一个突破。组件永远不应该尝试访问其父级;因为这通常会给组件带来不必要的依赖性,从而限制了重用。 “沟通”的正确方法是从itemRenderer调度一个事件并在父类中监听它。
这个概念简要介绍了您previous questions之一的答案。