ZK-1509 是 Vincent 大師在測試 layout 的時候發現的:
如果 Cardlayout 把 v/hflex 都設成 1,
然後放在 Hlayout 裡頭,當 browser 調整大小的時候,Cardlayout 就會消失!
怎麼可能!
Cardlayout很 nice 的,這其中一定有什麼誤會!
謎之聲:那是因為 Cardlayout 是你寫的吧? [指]
實際測試發現並不是 Cardlayout 的問題。
如果 Hlayout 裡頭塞設了 v/hflex 的 Div 一樣會不見,
或是不用 Hlayout 而用 Div 塞 Cardlayout 也不會出問題。
所以不是 Cardlayout 而是 Hlayout 的問題... 啊哈哈哈哈... [逃]
那麼,問題出在哪裡呢?flex 機制(下略數十字 [逃])在 beforeSize() 會要求 widget 作 afterResetChildSize_()。
Hlayout 的 afterResetChildSize_() 寫在 Layout.js,以純邏輯的講法會把 Hlayout 的大小設成 0,
這樣在後續的流程(應該是 fixFlex())才會重新計算 size。
原本的作法是將 Hlayout 的每個 child 抓出來,把 kid.$n('chdex').style.height 設成空字串。
chdex 是 ZK 當中的慣用字,parent 裡頭裝 child 就會多掛一個 id 是 CHILD_ID-chdex 的 div,
這個 div 的變數就會用 chdex。child 會塞在 chdex 裡頭,這樣某些操作會比較容易
(不要問我是哪些操作 [死])。
重設 child 的 chdex 看起來似乎沒啥問題,邏輯上也似乎合理,不然這個 bug 也不會這麼久才炸出來?
把 Hlayout 改成 Vlayout,完全不會發生消失的現象。
比對兩個的 DOM 差異,發現又是 inline-block 造成的問題,
Hlayout 有設定 display:inline-block 而 Vlayout 沒有。
這導致後頭在判斷是否要作 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() 要不要也比照辦理?
我們下回分解... (謎之聲:你的下回是來生吧...... [指])