`

Flex学习记录(使用ClassFactory 生成渲染器)

阅读更多
你想要在运行时改变List 或DataGridColumn 的渲染器,或改变渲染器的属性。
使用一个ClassFactory 对象做为ItmeRdnerer。ClassFacotry 实现了IFactory 接口,你只
要传一个类对象(即Class 类型的对象)给它,它就可以生成这个类的对象。
这种解决办法,使用了工厂设计模式,并且使用了flex 的一些内部机制。在使用工厂模
式时,你需要指定一个类型给工厂,这个类型的对象会被工厂类产生并做为渲染器使用,并
且工厂类可以控制渲染器的生命周期。那么我们如何把类型指定给工厂类呢?我们需要传一
个类对象给工厂类,正如下边的代码:
var factory:ClassFactory = new ClassFactory(oreilly.cookbook.SevenTwoFactory);
在这里原文提到了SevenTwoFactory 继承IFactory 等等,大家需要多了解一些
ClassFactory 的相关知识,在实际操作中,我们一般都是创建ClassFactory 的实例赋值
itemRenderer,因为set itemRenderer 方法需要的参数是IFactory 类型,系统最终会用这
个factory 对象实例我们的renderer。也就是说,我们给系统的不是一个renderer 而是
一个能产生renderer 的factory,在系统需要时自己用factory 产生renderer 的实例,也
许细心的读者会发现,当我们写mxml 的时候,itemRenderer 的属性可以赋值一个类路径,
这就是因为flex 对mxml 里的itemRenderer 做了一些特殊的功能,如果你传的是一个类路
径,系统帮你创建一个ClassFactory。,在本节的例子中其实在我们的应用中
SevenTwoFactory 只需是一个普通的类就OK 了,我看了本节后边SevenTwoFactory 的代码,
觉得作者这样做没有必要,所以还是不扯SevenTwoFactory 和IFactory 的关系了,不然反
倒让大家糊涂。在这里我们只需要知道, ClassFactory 的实例,赋值给list 或DataGrid
的itemRenderer 属性,系统会帮我们产生item renderer。
<cookbook:PurgeList id="list" itemRenderer="{factory}" width="300"/>

DynamicRenderer.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute">
<mx:Script>
	<![CDATA[
	public function changeRenderer():void
	{
		if(btnChange.label == "change to big"){
			list.itemRenderer = new ClassFactory(BigIconRenderer);
			//这里正如我在上边所说,这里只要传一个普通类就可以了,但实际开发中我们这里一般都传一个自定义组件,或类似的东西。
			btnChange.label = "change to small";
		} else {
			var cf:ClassFactory = new ClassFactory(SmallIconRenderer);
			//在下边的代码中我实例大家如何利用ClassFactory的properties属性给新生产的对象赋初值。
			//cf.properties = {xx:"heihei};
			var o:Object = new Object();
			o.xx = "xixi";
			cf.properties = o;
			//上边的写法,和上边注掉的写法都是可以的.但我觉得更负责的写法是:
			//if(cf.properties == null){
			// cf.properties = new Object();
			//}
			//o.xx = "hehe";
			list.itemRenderer = cf;
			btnChange.label = "change to big";
		}
	}
	]]>
</mx:Script>
<mx:List id="list" width="300" height="300" itemRenderer="SmallIconRenderer" variableRowHeight="true">
	<mx:dataProvider>
		<mx:Object label="this is item A"/>
		<mx:Object label="this is item B"/>
		<mx:Object label="this is item C"/>
		<mx:Object label="this is item D"/>
	</mx:dataProvider>
</mx:List>
<mx:Button id="btnChange" label="change to big"
click="changeRenderer()" x="308" y="10"/>
</mx:Application>


BigIconRenderer.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
public var item:Object = new Object();
]]>
</mx:Script>
<mx:Label text="{data.label}" fontSize="20" fontWeight="bold" color="0xff0000"/>
<mx:Text text="大"/>
</mx:HBox>


SmallIconRenderer
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
	<![CDATA[
	[Bindable]
		public var item:Object = new Object();
	[Bindable]
		public var xx:String;
	]]>
</mx:Script>
<mx:Label text="{data.label}"/>
<mx:Text text="小"/>
<mx:Button label="{xx}"/>
</mx:HBox>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics