flex4 讀書筆記 chapter 2

轉載自 selina_1113
最終編輯 selina_1113

 

 

1、自定義組件命名空間格式:xmlns:Tag="包名"。例如:xmlns:MyComps:com.humanmonth.*。調用格式:<tag:ClassName />。例如:<MyComps:MyImage/>。

2、swc是flex組件的歸檔文件。

3、數據綁定。一、在mxml中,組件用{}引用其它數據。當被引用數據被更改時,組件的{}值也會這被更新。

4、flex的遠程方法調用(Remote-procedure-call[rpc])用於flex與服務端交換數據(發送/接收)。flex有多種RPC服務,包括soap,amf(java),http。MXML包含以下幾種類型的RPC組件:soap、httpservice、remoteobject(amf protocol)。

5、在mxml文件中,在<fx:Declarations>標籤內定義一些非可視化組件。

6、數據模型(data model)。數據模型用於存儲數據。可以使用標籤<fx:Model>,<fx:XML>,<fx:XMLList>或as類。

7、用<fx:Model>定義數據模型的方法類似於直接寫xml。例如:<fx:Model id="myId"><myName>tt</myName></fx:Model。

8、數據驗證。可以在mxml的<fx:Declares>標籤中聲明驗證器,格式:<mx:EmailValidator source="{被驗證元素的ID}" property="text"/>

9、使用樣式表(css)。如果在mxml中使用<fx:style>標籤,即<fx:style>標籤必需要mxml文檔根元素的直接子元素。

10、常用的css選擇器有class選擇器和type選擇器。使用type選擇器時需要使用命名空間,語法如下:@namespace s "library://ns.adobe.com/flex/spark"; s|Button{}。

11、mx及spark架構中的一個主要區別是Spark組件依賴皮膚去定義佈局及外觀。而mx組件依賴樣式及皮膚。用mx組件時,你更多地去用樣式而用Spark時,你更多地是用皮膚是處理佈局及外觀。

12、使用效果(effect)。使用效果的步驟是先在<fx:Declarations>中定義一個效果,並在target中指明效果應用到的組件。然後在組件的相關事件中調用效果:effectId.play()。

13、用mxml自定義組件。步驟:找一個和自定義組件相近的類,然後在裏面添加或修改一些方法。調用方法與actionscript的自定義組件方法一樣。

14、在mxml中引用as中的靜態變量時,使用{fullpackage.class.Name}型式。

15、設置默認屬性(setting the default property)。很多flex組件定義一個單獨的默認屬性。默認屬性是一種速記機制,讓用戶不用輸入屬性名的情況下設置值。例如<s:List><s:ArrayCollection>與<s:List><s:dataProvider><s:ArrayCollection>是相等的。而裏面的dataPrivider是默認屬性。另外要注意,並不是所有的組件都有默認屬性。

16、在mxml中使用轉義字符。若在mxml中使用字符中有數據綁定或轉義符。即用正斜線轉義。例如:{,\。

17、換行符。你可以使用‘n’或‘&#13;’來代表換行。

18、在定義一些變量前加上[Bindable]標記表示當該變量改變時,引用該變量的對像會被通知/自定修改。

19、引入樣式或腳本的語法:<fx:Style source="url",<fx:Script source="url"。

20、在mxml中設置正則表達式屬性:/regex/flags。

21、用法上,as與mxml的關係與js和html相似。而編譯的角度看,as與mxml的關係和servlet與jsp相似。

22、無論是<fx:Script>還是<fx:Style>都必需是mxml文件根節點的子節點。

22、使用<fx:Script>,請在裏面加上<![CDATA[]]>。

23、MXML中,每個元素都有一個ID屬性。你可以直接通過ID引用該元素。如果元素沒有設置ID,你可以通過元素的父元素的getElementAt()、getChildAt()方法獲取元素。最後,你還可以通過方括號[名稱]的方式來獲取元素。

24、this是對當前文檔、對像、閉包的引用。

25、在as中創建可視元素的步驟是:先創建元素,然後加入到容器,最後設置元素的屬性。創建元素後,如果不加入到容器中,對像不會被顯視。加入容器的語法是MX架構:addChild()/addChildAt(),Spark架構:addElement()/addElementAt()。

26、默認情況下,元素被加入到容器的最後一個元素後面。如果你要指定順序,即需要用addElementAt()或調用addElement()後調用setItemIndex()。前者效率會高一點。

27、刪除元素。在Spark中,可以用removeELement(),removeElementAt(),removeAllElements()方法刪除元素。如果要是MX架構,即用Child替換上面的Element。

28、當調用容器的remove相關函數後,元素就會從顯視列表中去除。然而這並不代表對像會被GC刪除。緊當被刪除元素在外面沒有被引用時。flashGC纔會在適當的時候刪除對像。適時刪除無用元素會大大改善性能。

29、只有實現了IVisualElement接口的對像才能加入到顯視列表的容器中。如果對像沒有實現IVisualElement接口而想加入到顯視列表時,可以把對像先放到UIComponent後再加入到顯視列表。例如:new UIComponent().addChild(new Sprite());

30、引用。FlexGlobals.topLevelApplication是對根application的引用。parentDocument是在文檔鏈中對當前文檔的上一層文檔的引用。parentApplication是在應用鏈中對當前應用的上一層應用的引用。當被載入的應用與主應用不在同一應用域(ApplicationDomain)或安全域(SecurityDomain)時,上述引用不會生效。

31、在mxml中,元素的事件屬性代碼在mxml編譯後會變成一個方法。所以在元素事件屬性中的代碼的this是對文檔的引用而不是那個元素。

32、在mxml中引用as代碼有兩種方法,一種是<fx:Script source="pac/pac/fileName.as" />。另一種是include指令:include "filename";格式:<fx:Script>include "pac/filename.as"</fx:Script>。source支持相對或絕對路徑。而include指令緊支持相對路徑。include指令可放在if語句中(語句塊中要求只有include指令)。

33、as的內省(introspection)機制有兩種。它們常在調試過程中使用。一種爲for in 循環。另一種爲as的api。

34、for in循環會把動態加入的屬性及方法打印出來。然後大部份的as對像並不是動態對像,所以的for in循環中,絕大部份對像不會顯視屬性及方法。用for in循環打印動態屬性及方法與用mx.utils.ObjectUtil.toString()方法的效果一樣。

35、內省api。flash.utils.desctibeType() 。它們打印出public屬性及方法而不會打印私有的。返回的結果爲一個xml。

36、事件可以讓程序員知道事情發生。鼠標、鍵盤、網絡請求、組件生命週期等等都會觸發事件。

37、flash顯視列表的根元素爲Stage,往下爲:SystemManager->Application->其它顯視組件。這個列表我們稱爲顯視列表(display list)。

38、顯視列表的事件模型:捕獲-》目標-》冒泡。即發生事件後,事件會延着顯視列表樹從頂層到目標然後再冒到頂層。

39、事件被觸發時,fp(flash player)會創建一個事件對像,然後這個事件對像將在事件的三個階段中傳遞。在傳遞過程中,事件對像的某些屬性會被改變。你可能通過這些屬性知道事件的所在的階段。

40、flash.events.Event爲事件的基類。他的子類分佈在spark.events.*,mx.events.*,flash.events.*中。另外還有一些特殊作用的事件類分佈在另外一些包中。例如mx.messaging.events

41、顯視列表中的任何對像都繼承自DisplayObject,而DisplayObject繼承自EventDispatcher。EventDispatcher爲顯視列表中的所有類提供了事件模型的功能。

42、顯視列表中的任何對像都可以通過繼承自EventDispatcher的addEventListener來監聽事件。只要事件流通過該對像,該對像的監聽器都會被觸發。

43、EventDispatcher從名稱上說,主要功能爲分發事件。但在使用過程中,更多是用於添加與移動監聽事件。

44、當你需要事件模型中的功能,但又不能繼承EventDispatcher時,可以實現IEventDispatcher接口。

45、除了由fp發送事件對像外,有些時候你可能需要自已發送事件。這時你可能通過dispatchEvent方法發送自定義事件到事件流中。

46、event對像中的target爲觸發事件的對像。currentTarget爲正在處理事件的對像。

47、在mxml的元素中的事件屬性直接添加事件時,如果使用click=functionname()時,event對像不會被傳入到方法中。如果要傳入event對像,需要click=functionname(event);

48、addEventListener中的use_capture參數爲true時表示監聽器在捕獲階段被調用,如果爲false表示在冒泡階段被調用。如果不指定,那默認值會根據事件類型的不同而不同。如果你需要在事件的兩階段都解發事件,那你需要調用兩次addEventListener。use_capture參數一次爲true,另一次爲false。

49、addEventListener中的priority。如果不設置,priority默認值爲0。這種情況下,先調用addEventListener的監聽器會先被調用。如果設置了priority,即priority的值越高,越早被調用。

50、addEventListerer中的weakRef。默認爲false。如果此值爲false,即此監聽器不會被GC回收。如果爲true,此監聽器會被GC回收。

51、方法閉包在每次被調用時都會被創建。閉包的作用域在定義它的地方而不在調用它的地方。例如,閉包內引用外面的一個變量y,在調用它的方法外面也有一個變量y。即運行時,閉包引用的是定義的類中的y。

52、在addEventListener中使用閉包時,參數中的userWeepRef如果設爲true,在gc運行時可能會把閉包回收。這樣會出現不可預期的錯誤。

53、類級別的定義不會被GC回收,閉包除外。

54、使用addEventListener設置的監聽器不再被使用時,應該用removeEventListener移除。而在mxml中直接給onclick付值的方式增加的監聽器不能被移除。

55、爲一個對像的同一種類形事件添加多個觸發器的方法:在mxml的事件屬情中有分號隔開多個監聽器。例如:listener1();listener2()。或者利用addEventListener多次:obj1.addEventListener(click,m1);obj1.addEventListener(click,m2);

56、在監聽器中實現多個參數。由於addEventListener參數中的function是一個方法,且參數固定爲event。如果要實現監聽器多參數,方法有三個。一、閉包。因爲閉包中變量的作用域是定義它的地方。例如:obj.addEventListener("click",function(event){fun(p1,p2)}。二、在mxml的標籤屬情中設置監聽器,因爲在mxml中設置監聽器時,參數是隨意的。例如click="fun(event,p1,p2)"。三、把參數放在currentTarget對應的對像中。在實際使用過程中,第三種方法最簡單。

57、手動分發事件。由於UIComponent->DisplayObject->EventDispatcher。所以顯視列表中的所有對像都有dispatchEvent()方法。例如:obj.dispatchEvent(new Event("click"));

58、顯視列表中的大部份對像的事件都經歷事件模型中的三個階段(捕獲、目標、冒泡)。而不在顯視列表中的對像也具有相同的事件模型,但只有(目標)階段,例如socket的響應。另外, 在顯視列表中的格式對像、驗證對像也同樣只有目標階段。

59、默認情況下,所有的監聽器都只註冊在目標及冒泡階段,除非你手動註冊一些在捕獲階段的監聽器-addEventListener("click",func,true);

60、當你在一個對像中監聽一個click事件。當該監聽器響應時,並不一定代表是該對像dispatch的。很多情況下是該對像下的子對像觸發的。所以要區分好event中的target及currentTarget。

61、stopProgragation()與stopImmediatePropagation()的作用都是停止事件的傳遞,前者是阻止節點後面的事件被調用。後者是阻止當前節點當前事件往後的事件被調用。

62、無論是stopProgragation()還是stopImmediatePropagation()都阻不了默認事件的執行。例如Event.Close等。

63、在一羣組件中調用addEventListener註冊同一個方法的效率比較低(性能與內存)。可以考慮把方法註冊在父組件中。例如在流程圖中有一大羣節點。如果在所有節點中都註冊一些移動事件,這樣效率很低下。可以考慮把事件註冊在容器中,然後從target中獲取標識。再使用container[pre_id]獲取組件。這種做法可以加快應用的啓動速度及減小內存佔用。

64、一般把監聽鍵盤的任務放在最外層容器中。這樣可以統一管理。例如:FlexGlobals.topLevelApplication.addEventListener(KeyboardEvent.KEY_UP,fun)。另外需要注意,在app初始化後,FlexGlobals.topLevelApplication並不接收事件,你需要讓其中的任一個組件聚焦後,它纔會接收到事件。

65、keyCode與charCode的區別在於keyCode代表鍵盤上的一個鍵,而charCode代表該鍵產生的utf8的一個值。例如k與K的keyCode是相同的,而charCode不同。

66、判斷組合鍵的方法。例如判斷是否爲shift+q:if(event.shiftKey){if(event.keyCode==81){}}。

67、關於操作系統、瀏覽器與fp接收事件的順序。os第一,瀏覽器第二,最後纔是fp。所以當瀏覽器攔截了事件並關阻止事件後,fp會收不到事件。


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