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()
要不要也比照辦理?
我們下回分解... (謎之聲:你的下回是來生吧...... [指])