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.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
看來這樣也是一種 狀態切換的應用,效率高些罷了。