在Flex中使用Delegate pattern來設計更好的對話框 不同于C#和Java, Flex 并沒有定義一個明確的Dialog模式,我們常常使用popUp作為對話框, 可是每個人的實現方法各不相同,因此在這里我想介紹一種比較靈活的設計供大家參考.
Delegate是Flex中很有用的一個utility類,它起到了封裝一個callback同時保留其this指針的作用。它的用法很類似于C#中的Delegate只不過由于javascript是weak type,所以實現上更容易些。
我們可以在大多數需要callback的地方使用Delegate,而不用擔心this的問題。關于這個class的用法DevNet上有詳細的介紹,我就不多羅嗦了。這里主要用Delegate來設計一個比較靈活的Dialog。
在
應用設計中,我們應該注意到每個popup
dialog應該盡可能地被重復利用,打個比方一個輸入用戶信息的dialog, 即可能被建立用戶的函數使用也可能被修改用戶的函數使用。因此這個
dialog class不應該依賴于它的parent.其作用就是接受一個user
object讓用戶編輯并且在用戶按了ok后調用指定的callback并傳入被修改的user object.
以
下范例演示了如何利用Delegate來傳遞用戶數據,
當用戶調用createUser()的時候,Delegate封裝了onCreateUser()這個callback函數,而當modifyUser
()的時候,Delegate則封裝了onModifyUser()這個callback. 整個過程中User
Dialog并不需要知道究竟是誰在呼叫它.
//-------------------------- // Application.mxml //------------------------- function beginPopUp(popUpClass, popUpSize, initObj) { var w = popUpSize.w; var h = popUpSize.h; initObj.x = (this.width-w)/2; initObj.y = (this.height-h)/2;
var popUp = popupWindow(popUpClass, initObj); popUp.setSize(w,h); return popUp; }
function createUser() { beginPopUp( UserDialog, {w:600, h:450}, {delegate:Delegate.create(this, onCreateUser), title:"Create user", user:new User()}); }
function onCreateUser(newUser:User) { trace("Created a new user"); }
function modifyUser(user:User) { beginPopUp( UserDialog, {w:600, h:450}, {delegate:Delegate.create(this, onCreateUser), title:"Modify user", user:user}); }
function onModifyUser(modifiedUser:User) { trace("Modified a user"); }
//----------------------- // UserDialog.mxml //---------------------- function doClose(isOk) { if (isOk) { delegate(dataObj); } this.deletePopUp(); }
|