如果我们可以通过使用“outerdocument”对象从渲染项访问外部函数,那么我们无法从外部访问内部函数。

时间:2012-08-27 10:20:37

标签: actionscript-3 flex flex3 flex4.5 flexbuilder

这些是同一应用程序下的脚本,第一个是应用程序,第二个是在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>

1 个答案:

答案 0 :(得分:3)

  

如果我们可以通过使用从渲染项访问外部函数   “outerdocument”对象然后我们无法访问内部函数   外部。?

您似乎对itemRenderers有什么明显的误解。 itemRenderer是一个组件定义,有点像创建自己的类。因为您正在使用'outerDocument'引用,所以您将在另一个类中创建自己的内联/嵌入类。

为基于List的类中的每个可见项创建自定义itemRenderer类的实例;所以你自己的类被多次创建,这意味着你的itemRenderer函数有多个实例。 Flex如何知道您要调用哪个itemRenderer实例?事实上它不能。

这就是为什么你可以打电话,但你不能打电话。

如果您需要在itemRenderer中进行更改,则应该通过更改dataProvider的数据元素来进行更改。

对于所有意图和目的,我建议不要使用outerDocument。封装是一个突破。组件永远不应该尝试访问其父级;因为这通常会给组件带来不必要的依赖性,从而限制了重用。 “沟通”的正确方法是从itemRenderer调度一个事件并在父类中监听它。

这个概念简要介绍了您previous questions之一的答案。