2012-01-19 39 views
0

类的狗。请注意,狗不知道它的位置。从逻辑上说,狗不应该知道它的位置。从项目渲染器中包含类的调用方法

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方法,但我一直无法弄清楚如何做到这一点。任何帮助将不胜感激。

回答

0

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

您可以在定义s:List的MXML文件中设置此属性的值,然后重写项目渲染器上的set data方法以确定图像是否可见。

+0

呵呵,那就是我想的答案。我不会在Dog类中添加任何内容,因为它在我的代码库中的许多不同位置被使用了数百次。现在查看适配器模式.... – sixtyfootersdude

2

我不会绑定到该函数。反正你不需要。

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

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

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

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

0

项目渲染器用于仅显示数据而不是应用程序逻辑。
由于您的arrayCollection已经是可绑定的,您应该添加一个事件侦听器来调用hasDogEscaped。

0

你也可以做soemthing这样的:

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 
} 

然后在你的渲染,只是躲过狗比较渲染狗。这就解释了名单绘制后狗逃跑的原因

0

您可以使用“outerDocument”通过其中的方法访问文档。注意:该方法必须标记为公开。

替代方案,你可以把这个函数放在MyDogUtils.hasDogEscaped()这样的单例中,当你需要从项目渲染器(99%始终在设置数据覆盖)中调用它。

或者你可以把它作为静态方法放在项目渲染器中。

+0

注意:要使用outerDocument访问方法,必须将该方法标记为公共,因为它在另一个文档中。 –

相关问题