2016-09-09 70 views
0

我有一個應用程序,使用MVC模式,ZK 8版本和樹組件作爲菜單。應用程序本身使用邊界佈局和Tabbox作爲動態容器。菜單樹代碼在點擊時添加選項卡。我已經成功地做到了這一點,但效率很低。 是否有高效的替代方法或重構方法?ZK通用樹事件處理程序

的代碼是:

<zk> 
<style src="css/style.css" /> 
<borderlayout> 
    <north> 
     <div height="120px" 
      style="background:#3461b2 
      url('images/banner.jpg')no-repeat;" /> 

    </north> 

    <west title="Selamat Datang - ${sessionScope.userCredential.name}" 
    size="22%" autoscroll="true" splittable="true" collapsible="true" 
    vflex="max"> 
    <tree id="menuTree"> 
    <treechildren> 
     <treeitem label="Daily"> 
     <treechildren> 
     <treeitem label="Report 1"> 
     <attribute name="onClick"> 
<![CDATA[ 
Tab newTab; 
if (mainTabbox.getTabs().hasFellow("Report 1")) { 
    newTab = (Tab) mainTabbox.getTabs().getFellow("Report 1"); 
    mainTabbox.setSelectedTab(newTab); 
} else { 
    newTab = new Tab("Report 1"); 
    newTab.setId("Report 1"); 
    newTab.setClosable(true); 
    newTab.setSelected(true); 
    Tabpanel tb = new Tabpanel(); 
    Executions.createComponents("daily/report1.zul", tb, null); 
    mainTabbox.getTabs().appendChild(newTab); 
    mainTabbox.getTabpanels().appendChild(tb); 
} 
    ]]> 
     </attribute> 
    </treeitem> 
    <treeitem label="Logs"> 
      <attribute name="onClick"> 
     <![CDATA[ 
Tab newTab; 
if (mainTabbox.getTabs().hasFellow("Logs")) { 
    newTab = (Tab) mainTabbox.getTabs().getFellow("Logs"); 
    mainTabbox.setSelectedTab(newTab); 
} else { 
    newTab = new Tab("Logs"); 
    newTab.setId("Logs"); 
    newTab.setClosable(true); 
    newTab.setSelected(true); 
    Tabpanel tb = new Tabpanel(); 
    Executions.createComponents("Logs.zul", tb, null); 
    mainTabbox.getTabs().appendChild(newTab); 
    mainTabbox.getTabpanels().appendChild(tb); 
} 
     ]]> 
     </attribute> 
    </treeitem> 
    ... 
    ... 
    <center vflex="min" autoscroll="true"> 
     <div height="100%"> 
    <tabbox id="mainTabbox"> 
    <tabs id="tabs"> 
    <tab id="mainTab" label="Main" /> 
    </tabs> 
    <tabpanels> 
     <tabpanel> 
     <include src="/charts/mainChart.zul" /> 
     </tabpanel> 
       </tabpanels> 
      </tabbox> 
     </div> 
    </center> 
     .... 

回答

0

我找到了解決方案,通過使用ONSELECT listener屬性:

<tree id="menuTree"> 
      <attribute name="onSelect"> 
      <![CDATA[ 
    Treeitem item = self.getSelectedItem(); 
    if (item != null) { 
    Tab newTab; 
     if (mainTabbox.getTabs().hasFellow(item.getLabel())) { 
      newTab = (Tab) mainTabbox.getTabs().getFellow(item.getLabel()); 
      mainTabbox.setSelectedTab(newTab); 
     } else { 
      newTab = new Tab(item.getLabel()); 
      newTab.setId(item.getLabel()); 
      newTab.setClosable(true); 
      newTab.setSelected(true); 
      Tabpanel tb = new Tabpanel(); 
      Executions.createComponents(item.getValue().toString(), tb, null); 
      mainTabbox.getTabs().appendChild(newTab); 
      mainTabbox.getTabpanels().appendChild(tb); 
     } 
    } 
     ]]> 
    </attribute> 
      <treechildren> 
       <treeitem label="Daily"> 
        <treechildren> 
         <treeitem label="Tab Label" value="somepage.zul" /> 

         <treeitem label="Other Tab Label" value="otherpage.zul" /> 

.... 

參考來自:http://forum.zkoss.org/question/3675/tree-onselect-eventlistener/

+0

請告訴我,CDATA不用於產品代碼並僅顯示問題 – chillworld

+0

cdata是否被禁止? –

+0

不禁止,但這是原型設計的必要條件。它需要更多的資源,因爲您需要在運行時創建Java類。 – chillworld