班级犬。请注意,狗不知道它的位置。从逻辑上讲,狗不应该知道它的位置。
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 :(得分: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%始终在设置数据覆盖上)。
或者您可以将其作为静态方法放在项呈示器中。