flex DeferredInstanceFromFunction 使用

flex DeferredInstanceFromFunction

官網對這個類的介紹:

一個延遲實例工廠,它使用生成函數創建所需對象實例。應用程序使用 getInstance() 方法在首次需要對象實例時創建該實例,隨後獲取對該對象的引用。

api上這麼說,看來這個是單例的。

我前一篇文章http://demojava.iteye.com/blog/1175758 上介紹了一個as中自定義組件的方法,和這個 DeferredInstanceFromFunction  有什麼聯繫呢?筆者看源碼發現關係了:

 

mx.core.DeferredInstanceFromFunction 實現了 ITransientDeferredInstance 接口 而ITransientDeferredInstance 接口繼承了 IDeferredInstance 關係清楚了

官網對這個 類的介紹是:

ITransientDeferredInstance 接口擴展 IDeferredInstance,並可以使用戶將延遲的實例工廠重置爲其初始狀態(通常這意味着釋放對組件的任何已知引用,如將引用該實例的所屬文檔屬性設置爲 null)。如果所需的行爲是當某個狀態不再應用時破壞某個狀態特定的元素,則 AddItems 狀態覆蓋會利用此附加的功能。Flex 編譯器使用與 IDeferredInstance 相同的自動強操作規則。

【初始狀態】我就不明白了參考一些方法: 

 

另請參見

mx.states.AddItems
mx.core.IDeferredInstance

不懂難道控制狀態的?而這個 AddItems 是來之 mx.states.AddItems 看來想那麼回事。。。

 

下面上代碼說明他用途:

f4中自定義組件 Demo.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
		 xmlns:s="library://ns.adobe.com/flex/spark" 
		 xmlns:mx="library://ns.adobe.com/flex/mx"
		 creationComplete="creationCompleteHandler(event)">
	
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			import mx.states.AddItems;
			import mx.states.SetProperty;
			import mx.states.State;
			
			import spark.components.HGroup;
			import spark.layouts.VerticalAlign;
			private var _state2 :State=null;
			private var _group:HGroup=null;
			protected function creationCompleteHandler(event:FlexEvent):void
			{
				var _state1 :State = new State();
				_state1.name = "demo1";//狀態1
				var _item       :AddItems = new AddItems();
				_item.itemsFactory = new DeferredInstanceFromFunction(createButtonGroup);//createuttonGroup 添加控件
				_state1.overrides.push(_item);
				
				 _state2 = new State();
				_state2.name = "demo2";////狀態2
				states.push(_state1, _state2);// 其中 states 是UIComponent 的屬性
			}
			
			protected function createButtonGroup():HGroup
			{
				_group= new HGroup();
				_group.percentWidth = 100;
				_group.height = 50;
				_group.verticalAlign = VerticalAlign.MIDDLE;
				
				var _array       :Array = ["Button A", "Button B"];
				
				for(var i:int = 0; i < _array.length; ++i)
				{
					var _btn         :Button = new Button();
					_btn.name = "btn" + String(_array[i]);
					_btn.label = _array[i];
					_group.addElement(_btn);
				}
				
				return _group;                     
			}			
			
			protected function btn1_clickHandler(event:MouseEvent):void
			{
				currentState = "demo1";
			}
			
			protected function btn2_clickHandler(event:MouseEvent):void
			{
				currentState = "demo2";
			}
			
		]]>
	</fx:Script>
	
	<s:layout>
		<s:VerticalLayout />
	</s:layout>
	
	<s:states>
		<s:State name="normal"/>
	</s:states>

	<s:Button id="btn1" label="狀態1"
			  click="btn1_clickHandler(event)" />
	<s:Button id="btn2" label="狀態2"
			  click="btn2_clickHandler(event)" /> 
</s:Group>


 點擊狀態1 轉換到狀態1 點擊狀態2 切換到狀態2

看來這樣也是一種 狀態切換的應用,效率高些罷了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章