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,就又恢復正常行為。