2013-02-24

ZK-1509 的故事

ZK-1509 是 Vincent 大師在測試 layout 的時候發現的: 如果 Cardlayoutv/hflex 都設成 1, 然後放在 Hlayout 裡頭,當 browser 調整大小的時候,Cardlayout 就會消失!

怎麼可能!Cardlayout 很 nice 的,這其中一定有什麼誤會!
謎之聲:那是因為 Cardlayout 是你寫的吧? [指]

實際測試發現並不是 Cardlayout 的問題。 如果 Hlayout 裡頭塞設了 v/hflexDiv 一樣會不見, 或是不用 Hlayout 而用 DivCardlayout 也不會出問題。 所以不是 Cardlayout 而是 Hlayout 的問題... 啊哈哈哈哈... [逃]

那麼,問題出在哪裡呢?flex 機制(下略數十字 [逃])在 beforeSize() 會要求 widget 作 afterResetChildSize_()HlayoutafterResetChildSize_() 寫在 Layout.js,以純邏輯的講法會把 Hlayout 的大小設成 0, 這樣在後續的流程(應該是 fixFlex())才會重新計算 size。

原本的作法是將 Hlayout 的每個 child 抓出來,把 kid.$n('chdex').style.height 設成空字串。 chdex 是 ZK 當中的慣用字,parent 裡頭裝 child 就會多掛一個 id 是 CHILD_ID-chdexdiv, 這個 div 的變數就會用 chdex。child 會塞在 chdex 裡頭,這樣某些操作會比較容易 (不要問我是哪些操作 [死])

重設 child 的 chdex 看起來似乎沒啥問題,邏輯上也似乎合理,不然這個 bug 也不會這麼久才炸出來? 把 Hlayout 改成 Vlayout,完全不會發生消失的現象。 比對兩個的 DOM 差異,發現又是 inline-block 造成的問題, Hlayout 有設定 display:inline-blockVlayout 沒有。 這導致後頭在判斷是否要作 fixFlex()、檢查 visible (下略數十字,實在沒辦法搞懂什麼時候要用哪招判定 visible )失敗, 導致根本不會作 fixFlex()

於是就卡關了...... Orz

後來 Vincent 大師在對付 ZK-1569 發現,重設 chdex 雖然合理,不過重設 child 應該更合理一點。 而且這樣一來問題也會消失;跟 ZK-1569 很類似的 ZK-1509 應該也可以比照辦理。 於是把 afterResetChildSize_() 原本 chdex = kid.$n('chdex'); 改成 chdex = kid.$n() 就結案了。

至於為什麼當初要設定 CHILD_ID-chdex 而不是設定 child 本身? resetSize() 要不要也比照辦理? 我們下回分解... (謎之聲:你的下回是來生吧...... [指])

2013-01-06

ZK-1309 的故事

正確來說,ZK-1309 應該稱之為 onFloatUp 的故事...... [淚目]

故事發生在 modal window 當中如果用了 Clients.showNotification(), 要再對 modal window 作 drag 的時候,覆蓋畫面的 mask 就會消失, 在 drop 的時候才又出現;令人傻眼的是,如果繼續 DnD,就又恢復正常行為。

2012-12-30

ZKPushState:用純 Java 處理 History API 的 ZK addon

簡介

HTML5 的規格中引入了新的 History API:

  • history 可以呼叫 pushState() 把一些資料(稱為 state)設定進目前的 session(單純的名詞,不是 HTTP 的那個 session), 並且可以更改目前的 URL(如果有給值的話)
  • history 有變動,browser 會發出一個 onpopstate event,在 window.onpopstate 可以接收到。

2012-11-18

ZK-1220 的故事

ZK-1220 (又)是一個抓蟲三刻鐘,除蟲三秒鐘的 issue。

故事是這樣的,在 ZK 6.0 之後 InputElement/InputWidget(Java/JS)增加了 instant 這個 attribute。 當 instant="true" 的時候,所有的改變會馬上送到 server 端。 如果 end-user 在有設定 instantTextbox 輸入之後馬上(更精準地說是 350ms 內)改變游標位置, 則游標還是會回到最尾端。

2012-11-14

ZK-1441 的故事

ZK-1441 的故事有點 critical,基本上他一定要「快速連續切換 tab」才會有效果,正常操作行為很難遇到這個狀況。

WTF......

終究是名副其實可以複製的 bug,也就只能硬著頭皮上。

Tab._sel()
    Tab._setSel()
        Tabpanel._sel()
            jqzk.slideDown(),在這裡 this.dimension() 會取到錯(較小)的值

基本上無力去探究 jqzk.dimension() 為什麼會取到不對的值,畢竟正常情況下運作是正確的。 只能猜測是因為 animation 的原因導致 jquery 錯亂?

中間試過 setTimeout() 來等 animation 完再換下一個 tab 操作,不過失效(細節略 XD)。 後來只能把腦筋動到弄一個 flag: Tabbox._animating,在呼叫 slideDown() 之前設定, 透過 slideDown() 的 callback function 來拿掉,然後進入 Tab._sel() 的時候用這個判斷是否要擋掉不做。

至於為什麼不用 zk.animating(),那是因為只要有其他 animation 在跑(例如檔案上傳的 Progressmeter), 就會判定不過而被卡掉。(反過來說,用 zk.animating() 來作某些事情的都有這個隱憂?)

套句死神裡頭的台詞(其實我沒看過):「其實我不想用這招的」, JS 對 field 作 CRUD 實在太方便了,一點控管辦法也沒有,只好多寫幾行註解結束這個 issue。