item renderer 歡樂新發現
item renderer 是 List 系列元件的神兵利器,善用它,什麼鬼玩藝都做的出來,唯一遺憾的是它的運作規則非常複雜,伴隨不同的 List 元件它的行為還會有不同的變化。
而最棒的是,每當你認為已經完全摸透一切技巧時,才會不經意發現,x,怎麼又來一個陷井啊…
這次出現的是 double item renderer issue。
晚上在 trace 一支程式時,發現好像某個 item renderer 裏面的 event handler 會被 trigger 兩次,雖然這種事轉個頭假裝沒看到讓它過去也就算了,壞就壞在該死的好奇心總是會不經意的回想到底哪兒出錯了?結果一路從 data, creationCompleted 追查下來,不知道設了多少個 break point 與 trace(),終於發現問題。
List 系列元件裏有一支 method 是
mx_internal function getMeasuringRenderer(data:Object):IListItemRenderer
這支 method 顧名思義就是建立一個 dummy item renderer 來量位置(例如每個 item renderer 的高度之類的),悲情的是,它是真的從 item factory 裏建一個新的 dummy renderer 然後將 data 餵進去 (在我的例子裏是一個 VO) 如此才能精準的畫出正確的畫面,這樣量起來才準。
但這個 dummy renderer 造成的問題可不小,如果在你的 renderer 裏有偵聽 data 改變並做後續的處理,要小心這些 functions 都會很歡樂的被觸發兩次(或多次,看你帶塞的程度),重覆觸發小則是多耗些 cpu cycles,大則是誤刪資料或造成 app 其它地方掛掉,不可不慎。
所以該怎麼預防?很簡單,dummy renderer 的名稱一律是 “hiddenItem”,所以只要先檢查這個名字再決定是否跑後續的 functions 即可。
小結論:江湖一點訣,說破不值錢,但要發現卻很難啊,誰來還我美好的一小時 XD


2 Comments Add your own
1. walktree&hellip | May 9th, 2008 at 9:10 am
不光是List,TileList也是这样的。最近刚写了一文:http://www.fluidea.cn/blog/index.php/2008/05/06/82/
2. admin&hellip | May 9th, 2008 at 9:20 am
hey nice post
我指的是 “List 系列元件” = all list-based component, 實際上受影響的包括 Tree, List, TileList(尤其是 TileList 最恐怖)…
Trackback this post | Subscribe to the comments via RSS Feed