跳到主要內容

發表文章

目前顯示的是 四月, 2016的文章

ZK 教學 - 瀏覽器頁籤 (tab) 被關掉後進行處理

如果你想要在 browser tab 關掉時去執行一些應用程式邏輯,例如清理資料等等。我們可以傾聽 browser tab 關掉的事件,這件事等同於 ZK 的 desktop 被移除。 ZK 提供一個 DesktopCleanup listener讓你可以傾聽任何一個 desktop 被移除的事件,所以只要發現你所關注的那一頁的 desktop 被移除了,那就是該 tab 被關掉了,你可以在該 listener 中實作你的應用程式邏輯。範例如下:import org.zkoss.zk.ui.Component;import org.zkoss.zk.ui.Desktop;import org.zkoss.zk.ui.select.SelectorComposer;import org.zkoss.zk.ui.select.annotation.Listen;import org.zkoss.zk.ui.select.annotation.Wire;import org.zkoss.zk.ui.util.DesktopCleanup;import org.zkoss.zul.Div;publicclassCloseComposerextendsSelectorComposer<Component>{@WireDiv root;@Overridepublicvoid doAfterCompose(Component comp)throwsException{super.doAfterCompose(comp);//or register in zk.xml getPage().getDesktop().addListener(newMyDesktopCleanupListener());}@Listen("onClick = #exit")publicvoid processAfterExit(){System.out.println("processAfterClose "+ root.getId());}classMyDesktopCleanupListenerimplementsDesktopCleanup{@Overridepublicvoid cleanup(Desktop desktop)…

ZK 教學 - 常見錯誤用法 05 - 用 @NotifyChange 通知 ListModel 改變

以 MVVM 方法開發時,我們通常必須要用 @NotifyChange 來通知 ZK ViewModel 中的某個特定 property 更改了,這時 ZK 會重新載入該 property 去更新畫面。但是若是使用 ZK 提供的 ListModel 的實作物件則有例外 (e.g. ListModelList),因為 ZK 元件都會傾聽 ListModel 的變動,因此如果你改變其內容,元件都會知道並只 render 差異的部分,並不需要被通知。這時若是加上 @NotifyChange 有什麼壞處呢?它反而會使 ZK 重新載入整個 ListModel 並 re-render 其中所含有的資料,如此一來,比起元件內建的機制只 render 差異部分還來得更沒效率。