0

这些是同一应用程序下的脚本,第一个在应用程序下,第二个在 dataGrid 下。从第一个脚本到 outerClick() 我正在访问 itemrenderer 中的 inner() 函数。好吧,我可以通过 outerDocument 对象轻松地从 innerClick() 访问函数 outer(),但是 what_to_use 可以从 outerClick() 函数访问 itemrenderer 中的 inner() 函数。我尝试使用 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>
4

1 回答 1

3

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

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

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

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

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

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

在回答您之前的一个问题时简要介绍了这个概念。

于 2012-08-27T12:56:48.997 回答