2012-08-27 30 views
0

这些是同一个应用程序下的第一个脚本正在申请中,第二个脚本在dataGrid下。从第一个脚本到outerClick()我正在访问itemrenderer中的inner()函数。那么我可以通过outerDocument对象轻松地从innerClick()访问函数outer(),但是可以使用what_to_use从outerClick()函数访问itemrenderer中的inner()函数。我尝试过使用mx:component id“”和class =“”,但它无法识别itemrenderer下的函数。如果我们可以通过使用“outerdocument”对象从渲染项目访问外部函数,那么我们不能从外部访问内部函数。

<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> 

回答

3

如果我们可以通过使用 “添加outerDocument”对象然后倾斜我们从 访问内部函数外部访问从再现项目外的功能。?

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

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

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

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

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

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

+1

我终于通过派发一个事件来实现它。感谢您解释这个概念。它清除了我的一些误解...... –