2014年11月26日 星期三

jsf datatable row background


前題一樣是 jsf iceface 1.8...
這次是關於datatable 填背景色的問題~

一般最常用的就是資料每列換個底色~一灰一白,讓每一列可能更突顯出來~
在jsf是個friendly的設定
<ice:datatable ........................rowClasses="mystyle1,mystyle2" .....>
使用rowClasses,","分隔(他對於顯示方法有他自己的一套定義,跟CSS公開的selector寫法不同~喵的說少學一套,對偶來說跟本是要多記一套=_=),他就會依照順序一直重覆下去,如果想做三色或是七彩漸層就是...mystyle1,mystyle2, mystyle3, ..., mystyleN

然後要知道一點~搭配paging的時候,下一頁還是照順序~
ex: rowClasses 設定1,2,3...一頁顯示筆/共20筆,
page1: 1231231231,page2:1231231231...
每一頁都一樣啦~~~

所以如果只是某一列資料要變色,如果想指定第一筆變色,或當其他條件變色時~
就...雖然google告訴偶有人說~
rowClasses="#{ myrow.check == 'A' ? 'mystyle1'  : 'mystyle2'}"
但是對我來說就是not working <--最近這個關鍵字都快打爛了一_一(不只jsf造成的)
不過有人打勾,可能是其他版或其他plugin吧一.一a...反正...

你知道的~在規則之外只能使出骯髒手段了...


方法一:
如果資料列數不多,就把dataPaginator 改成scroll bar的方式,或是加大datatable row到全筆數,總之就是不做分頁。
把class用自訂的後端bean參數帶入 rowClasses="#{bean.tableCssList}"
在此屬性只能為 String type,內容一樣用","分隔
public String getTableCssList()  {
    return "style1,style2,style2,style2,style2,style2,style2,style2,style2";
}


方法二:
前者限制較多,但是程式相對簡潔,符合少學一樣的做法,
接下來的方式是對前端override的方式~不需要後端~
改在column上,等於對table td cell改,缺點是每一個column都要貼一次(因為要補滿一排)
然後某些項目需要用!impotant做覆寫才會成功
<ice:column styleClass="#{ myrow.check == 'A' ? 'cellstyle1'  : 'cellstyle2'}">
.......
</ice:column>

.cellstyle1  {
    padding: 0 0 0 0;
    background-color: red;
    text-align: center !important;
}

.cellstyle2  {
    padding: 0 0 0 0;  
    text-align: center !important;
}


方法二是偶最後採用的做法,彈性比較大,雖然多加了CSS...因為他又粉爛的是
column的 style和styleClass 不能同時使用(這又是什麼神邏輯,output成html時,不就append有這麼難嗎!!)
優點是雖然code比較多,但是未來可以做彩色磚一.一+...而且不受分頁影響
其實網路上大家也都有提到二的解法,差別只是因為大家都只改顏色,沒把padding刪掉就以not working告終...

唉,是誰說學tag就可以不用學CSS/JS的,用tag反而得用更高深的基礎才能應用!