跳到主要內容

ZK 教學 - 常見錯誤用法 02 - 存取別的 Desktop 中的元件

ZK 中 Desktop 的概念約略等同一個 browser tab,每個元件都會歸屬某個特定的 Desktop,而 ZK 的一個元件在實作上其實是由前端的 widget 加上後端的 Java 物件兩兩一組構成。我們是透過操作後端 Java 元件來操作前端 widget。這個從屬關係不能被打亂,否則 操作 Java 物件若找不到對應的前端 widget 就會產生錯誤。

所以,如果你存取到另一個 Desktop 的元件,例如呼叫該元件的 setter ,這時候理當元件要透過 HTTP response 去控制前端的 widget,但 如果 ZK 發現現在的 Destkop 跟元件的原所屬的 Desktop 不相同,就會拋出以下例外

java.lang.IllegalStateException: Access denied: component, <Listcell z_27_b53>, belongs to another desktop: [Desktop g272]

這種情形可能發生在:

  • 你將指向某個元件的變數透過 event queue 傳到 Desktop scope 以外,例如 session or application scope,並且在另一個 Desktop 存取該元件

解決方法:
傳遞資料本身,而不要傳元件。例如我要把 page1.zul 中的 Textbox 輸入值,傳到另一個 page2.zul 中做處理,這時就不應該把 Textbox 直接當參數傳出去,而是把 Textbox.getValue() 傳出去。

  • Composer 中有一個指向元件的變數是 static

解決方法:
不要將指向元件的變數宣告成 static

留言

這個網誌中的熱門文章

iframe DOM 被移動造成重新載入

如果用 javascript 去搬動 iframe DOM 的位置, 瀏覽器會將其內容重新載入,這是現有 HTML 規格 > When an iframe element is inserted into a document that has a browsing context, the user agent must create a nested browsing context, and then process the iframe attributes for the "first time". 範例: http://jsfiddle.net/pZ23B/ 測試結果: * Safari 3.1 / Win: reload * Opera 9.5 / Win: reload * IE10: reload * IE7 / IE8: not reload (部份摘自 https://bugzilla.mozilla.org/show_bug.cgi?id=254144 ) 參考: * https://bugzilla.mozilla.org/show_bug.cgi?id=254144

JavaScript 關掉瀏覽器頁面

如果你直接呼叫 window.close() 來關掉目前的頁面的話,你應該會在 console 看到以下訊息: Scripts may close only the windows that were opened by it. ( 我在 Chrome, Firefox, IE 11 都試過) 主因就是你並沒有用 JavaScript 開啟這個頁面,所以也不能用 JavaScript 關掉它。這是 HTML window.close() 的規格 規定,各家瀏覽器應該都遵循。 隨著瀏覽器安全性增加,以下方法已經不適用了,可參考 這個討論 。 有個變通的辦法就是: window.open(location, '_self').close();

Web Dynpro 前後端資料流動機制 (Dataflow)

在Web Dynpro中提供3種資料流機制[1],只要適當地設定,可以不用寫程式就將畫面、中間層控制器(controller)到後端模型物件的資料自動化地、牢靠地綁在一起,使得不管前後端某一方有資料變動,變動部份都會自動地流動來保持一致性,使得前後端都能存取到同一份資料。 context 關鍵元件是 context,每個controller都有一份屬於自己的context,它扮演MVC架構中的M (model),web dynpro的實做方式比較像是該controller的「資料空間」,它由node(資料節點)與attribute(資料屬性)組成,controller可以透過wdContext這個預先產生好的 shortcut variable(捷徑變數)去取得context的資料內容。 context中必須要建立node才可以儲存資料,一個node代表一個collection(集合物件)裡面仍可以含有node, attribute,node裡面的一份資料實體就是一個element,一個node可以有一個或多個element(這部份可以透過cardinality property設定),其結構就是該node所包含的結構。 data binding 此種機制可以將UI元件的資料跟context中的某個node或attribute綁定在一起,context中的改變會自動 更新到UI元件上,UI元件的改變也會自動寫入到綁定的context node(or attribute)中。通常UI元件所綁定的node(attribute)是由component controller對應過來的。 context mapping 每一個controller都有屬於自己的context(資料空間)如果要達到彼此共享資料,則要透過context mapping機制,一旦mapping設定好,則會在另一個context產生一個同樣的結構的node,兩邊的controller會存取到的是同一分資料,任何一邊的資料更動都會散佈到設定好mapping的node。 不過在web dynpro裡,只允許將custom controller or component controller的node對應到view controller去,不允許從view controller對應回來,主因是嚴格遵守MVC...