从项呈示器中包含类的调用方法

时间:2012-01-19 19:11:57

标签: flash actionscript-3 flex itemrenderer

班级犬。请注意,狗不知道它的位置。从逻辑上讲,狗不应该知道它的位置。

public class Dog { 
    public var name:String;
    public var age:Number;
}

一个UI组件,显示列表中的所有狗。有一种方法可以确定狗是否已逃脱。

<?xml version="1.0" encoding="utf-8"?>
<s:VGroup ... >
    <fx:Script>
        <![CDATA[
            [Bindable]
            private var listDataProvider:ArrayCollection /* ArrayCollection of Dogs */

            public var hasDogEscaped(dog:Dog):Boolean {
                return ...;
            }
        ]]>
    </fx:Script>
    <s:List id="list" dataProvider="{listDataProvider}" itemRenderer="DogItemRenderer"/> 
</s:VGroup>

项目渲染器显示狗的名字,以及狗是否在狗的名字旁边有一个解释标记。

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer ...>
    <s:Label text="{(data as dog).name}" verticalAlign="middle" height="100%"/>

    <mx:Image id="dogEscaped" 
              visible="{???????????????????????????????????????.hasDogEscaped(data as Dog)}"
              source="@Embed(source='/assets/icons/warning.png')"/>
    </s:Group>
</s:ItemRenderer>

我想要做的是让项呈示器从项呈示器调用hasDogEscaped方法,但我无法弄清楚如何做到这一点。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

我不会绑定到该函数。无论如何你都不需要。

override public function set data(value:Object):void{
   if(value){
    super.data = value;
    dogEscaped.visible = yourFunction(data);
   }
}

现在,如果要将yourFunction的非静态版本传递到dataGrid,则需要将其添加为属性。为此,您需要使用ClassFactory将属性传递给itemRenderer。基本上看起来像这样:

 dogItemRenderer= new ClassFactory(DogIteMRenderer);
 dogItemRenderer.properties = {dogEscapedFunction: dogEscapedFunction};
 dogColumn.itemRenderer = dogItemRenderer;

现在确保itemRenderer中有一个名为dogEscapedFunction的属性。

答案 1 :(得分:0)

简而言之 - 您需要在Dog类上添加isVisible属性。虽然狗不应该知道它的位置 - 它确实需要知道它是否可见。创建一个项目渲染器(和一个项目渲染器)的路径通常是一个坏主意。 (如果这超出了Dog类的范围,那么您可以使用Adapter模式来包装现有类并添加其他属性。)项呈示器需要接收正确显示其呈现内容所需的所有数据

您可以在MXML文件中设置此属性的值,该文件定义s:List - 然后覆盖项呈示器上的set data方法,以确定Image是否应该可见。

答案 2 :(得分:0)

项目渲染器仅用于显示您的数据而不用于应用程序逻辑。
由于您的arrayCollection已经可绑定,因此您应该向其添加一个事件侦听器,以便在更改时调用hasDogEscaped。

答案 3 :(得分:0)

您也可以这样做:

protected var escapeAlarm:IEventDispatcher;
[Bindable]
protected var dogItemRenderer:ClassFactory = new ClassFactory(DogItemRenderer);//you can bind to this renderer in your List component or whatever

//call from creationComplete
protected function init():void {
   dogItemRenderer.properties = {alarm: escapeAlarm};//again, you'll need to expose an alarm property on your renderer
}

public function dogHasEscaped(escapee:Dog):void {
  escapeAlarm.dispatchEvent(new DogHasEscapedEvent('escapeAlert', escapee);//will need custom Event Class, post back if you need help
}

然后在你的渲染器中,只需将逃脱的狗与渲染的狗进行比较。这解释了在List绘制后逃脱的狗

答案 4 :(得分:0)

您可以使用&#34; outerDocument&#34;用你的方法访问文档。注意:该方法必须标记为公开。

替代方案,您可以将函数放在像MyDogUtils.hasDogEscaped()这样的单例上,并在项目渲染器中需要时调用它(99%始终在设置数据覆盖上)。

或者您可以将其作为静态方法放在项呈示器中。