1. 程式人生 > >zk 資料繫結例項(grid巢狀)

zk 資料繫結例項(grid巢狀)

忙了一天終於把這個問題搞定了,雖然有點累,不過心裡很興奮,呵呵!

進入正題!

問題: grid裡巢狀grid。

解決方式: 利用zk的資料繫結方式對grid資料進行賦值。

第一步:首先建立外層grid頁面。程式碼如下:

<?page title="devices" contentType="text/html;charset=UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"  root="../lmtInfoWindow"?>
<zk>
    <style dynamic="true">
        tr.z-row .z-detail-outer, tr.z-row .z-row-inner { background:
        none; }

        tr.z-row td.z-row-inner { border-left-width: 0;
        border-right-width: 0; border-color: gray; }

        .z-column .z-column-cnt { padding: 2px; font-weight: bold;
        font-size:13px;}

        tr.z-row.last td:first-child span { font-weight: bold; color:
        #06488E; }

        tr.z-row td.z-row-inner { border: 0; }

        .sapphire .inner-grid tr.z-row .z-row-cnt { color:black; }

        DIV.z-grid-body{ overflow-x: hidden; overflow-y:auto; }
    </style>
    <window id="lmtInfoWindow" use="cn.microvideo.alarm.ui.LmtInfoUI "
        xmlns:h="http://www.w3.org/1999/xhtml"
        xmlns:n="http://www.zkoss.org/2005/zk/native"
        xmlns="http://www.zkoss.org/2005/zul"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
        <grid fixedLayout="true" id="lmtGrid" height="530px"
            align="left" model="@{lmtInfoWindow.lmtList }">
            <columns>
                <column width="40px" />
                <column label="流媒體名稱" />
                <column label="流媒體IP" />
                <column label="狀態" />
                <column label="型別" />
                <column label="是否外接儲存" />
                <column label="作業系統當前時間" />
            </columns>
            <rows>
                <row self="@{each=lmt}" align="left">
                    <detail open="false"
                        fulfill="onOpen=alarm_lmtspace.zul" />
                    <label value="@{lmt.lmtName}"></label>
                    <label value="@{lmt.lmtIp}"></label>
                    <label value="@{lmt.lmtState}"></label>
                    <label value="@{lmt.lmtType}"></label>
                    <label value="@{lmt.lmtIsConnectStore}"></label>
                    <label value="@{lmt.lmtLastVideoTime}"></label>
                </row>
            </rows>
        </grid>
        <paging></paging>
    </window>
</zk>

LmtInfoUI頁面:

public class LmtInfoUI extends Window implements AfterCompose {
    // 繫結器
    protected AnnotateDataBinder binder;
    // 前端zul頁面grid的id
    private Grid lmtGrid;
    // grid model屬性繫結的資料,提供get set方法
    private List<AlarmLMTInfos> lmtList = new ArrayList<AlarmLMTInfos>();

    @Override
    public void afterCompose() {
        Components.wireVariables(this, this);
        Components.addForwards(this, this);

    }

    public void onCreate() {
        binder = (AnnotateDataBinder) this.getVariable("binder", true);
        onLoadLmtList();
    }

    // 載入使用者列表,與button元件的forward屬性繫結
    public void onLoadLmtList() {
        // 呼叫服務,如果與spring整合,可以使用SpringUtil.getBean("UserService");
        // UserService userService = new UserServiceImpl();
        lmtList = findAll();
        // 更新grid,顯示資料
        binder.loadComponent(lmtGrid);

        // 立即顯示所有行,不延遲載入
        // userlistGrid.renderAll();
    }

    public List<AlarmLMTInfos> findAll() {
        // 僅作為演示,實際操作,訪問資料庫
        List<AlarmLMTInfos> lmtList = new ArrayList<AlarmLMTInfos>();
        AlarmLMTInfos lmt = null;
        Random random = new Random();
        for (int i = 1; i < 11; i++) {
            lmt = new AlarmLMTInfos();
            lmt.setLmtName("測試" + i);
            lmt.setLmtIp("123.123.123.123");
            lmt.setLmtState("線上");
            lmt.setLmtType("定製");
            lmt.setLmtIsConnectStore("是");
            lmt.setLmtLastVideoTime(new Date());
            lmtList.add(lmt);
        }
        return lmtList;
    }

    public List<AlarmLMTInfos> getLmtList() {
        return lmtList;
    }

    public void setLmtList(List<AlarmLMTInfos> lmtList) {
        this.lmtList = lmtList;
    }

}

第二步:建立第嵌入的grid 程式碼如下:

<?page title="devices" contentType="text/html;charset=UTF-8"?>
<?variable-resolver class="cn.microvideo.alarm.ui.lmtSpaceResolver"?>
<zk>
    <window>
        <grid fixedLayout="true" id="lmtSpaceGrid" height="300px"
            align="left" sclass="inner-grid">
            <columns>
                <column label="目錄" />
                <column label="大小(G)" />
                <column label="已用(G)" />
                <column label="剩餘(G)" />
            </columns>
            <rows>
                <row forEach="${lmtSpaceList}" align="left">
                    <label value="${each.lmtSpaceName}"></label>
                    <label value="${each.lmtSpaceSize}"></label>
                    <label value="${each.lmtSpaceUsed}"></label>
                    <label value="${each.lmtSpaceAvail}"></label>
                </row>
            </rows>
            <foot>
                <footer label="Avg1:" />
                <footer label="Avg2:" />
                <footer label="Avg3:" />
                <footer label="Avg4:" />
            </foot>
        </grid>
    </window>
</zk>

lmtSpaceResolver 頁面:

public class lmtSpaceResolver implements VariableResolver {
    private List<AlarmLmtSpace> lmtSpaceList = new ArrayList<AlarmLmtSpace>();
    private AlarmLmtSpace lmtSpace;

    @Override
    public Object resolveVariable(String name) throws XelException {
        return "lmtSpaceList".equals(name) ? findAll() : null;
    }

    public List<AlarmLmtSpace> findAll() {
        // 僅作為演示,實際操作,訪問資料庫
        List<AlarmLmtSpace> lmtSpaceList1 = new ArrayList<AlarmLmtSpace>();
        AlarmLmtSpace lmtSpace1 = null;
        Random random = new Random();
        for (int i = 1; i < 11; i++) {
            lmtSpace1 = new AlarmLmtSpace();
            lmtSpace1.setLmtSpaceName("root");
            lmtSpace1.setLmtSpaceSize("121212.12121");
            lmtSpace1.setLmtSpaceUsed("33232323");
            lmtSpace1.setLmtSpaceAvail("1212121212.12121");
            lmtSpaceList1.add(lmtSpace1);
        }
        return lmtSpaceList1;
    }
}

還有兩個POJO類,不在這貼了。

中間碰到了兩個問題:

第一個:Not unique in ID space <LmtInfoUI lmtInfoWindow>: lmtSpaceWindow,這個問題的原因是我嵌入的grid也是按照外層grid的方式進行寫的。在嵌入的grid頁面裡對window元件的Id進行資料繫結,出現了這個錯。

第二個:是我發現第一個問題後,進行解決這個問題出現的問題,如果嵌入的grid不存在window元件Id,那麼就不會現 Not unique in ID space,去掉Id,在zul檔案頭宣告

<?variable-resolver class=""?>,單獨測試嵌入的grid的時,執行正確,不過當把該grid嵌入後,執行報錯。

Page is already covered by another Data Binder. Cannot be covered by this Data Binder again. Page

解決第二問題是用foreach方式對grid資料進行遍歷的,沒有用AnnotateDataBinder,解決這個問題後,測試成功!

參考資料:

http://books.zkoss.org/wiki/ZK_Getting_Started/Tutorial

提供下載賺點積分,沒積分了,呵呵。

http://download.csdn.net/detail/gaozhlzh/3726009