2011-07-05 54 views
4

我使用tabbox來創建標籤頁面。每個標籤包含另一個zul頁面。我有1個控制器應用於主頁面。ZK包含.zul頁面不支持主控制器

如果我在包含的zul頁面的組件上添加了一些動作,控制器類我無法捕捉它。如果我將控制器應用於我的zul,則會創建控制器類的新實例。

這是我的代碼。

<zk> 
    <style src="/resources/css/default.css" /> 
    <window id="Dealer" class="index" 
     apply="com.i2i.prm.controller.IndexController" width="100%" 
     height="100%"> 


     <div class="content" > 

      <tabbox id="tb" width="100%" forward="onSelect=onSelect"> 
       <tabs id="tabs"> 
        <tab id="info" label="INFO" /> 
        <tab id="create" label="CREATE" /> 
        <tab id="edit" label="EDIT" /> 

       </tabs> 
       <tabpanels> 
        <tabpanel id="DealerInfo"> 
         <include id="DealerInfoContent" src="View/Dealer/DealerInfo.zul" /> 
        </tabpanel> 
        <tabpanel id="DealerCreate"> 
         <include id="DealerCreateContent" src="View/Dealer/DealerCreate.zul" /> 
        </tabpanel> 
        <tabpanel id="DealerEdit"> 
         <include id="DealerEditContent" src="View/Dealer/DealerEdit.zul" /> 
        </tabpanel> 

       </tabpanels> 
      </tabbox> 
     </div> 
    </window> 

</zk> 

而且dealerEdit.zul

<zk> 
<window title="Dealer Edit" > 
    <grid width="100%" sizedByContent="true"> 
          <columns> 
           <column label="" /> 

          </columns> 
          <rows> 
           <row > 
            <label value="Name"></label> 
            <textbox 
             value="@{DealerController.user.name }"> 
            </textbox> 
           </row> 
           <row> 
            <label value="Surname"></label> 
            <textbox 
             value="@{DealerController.user.surname }" forward="onChange=onASD"> 
            </textbox> 
           </row> 
           <row> 
            <label value="Address"></label> 
            <textbox 
             value="@{DealerController.user.address }"> 
            </textbox> 
           </row> 

          </rows> 
         </grid> 
</window> 
</zk> 

這是我的控制器(IndexController.java)類:

public class IndexController extends GenericForwardComposer { 

    private User user = new User();; 
    AnnotateDataBinder binder; 
    Tabbox tb; 

    @Override 
    public void doAfterCompose(Component comp) throws Exception { 
     // TODO Auto-generated method stub 
     super.doAfterCompose(comp); 
     comp.setAttribute(comp.getId() + "Controller", this); 
     binder = new AnnotateDataBinder(comp); 

     user.setName("Abdul"); 
     user.setSurname("Rezzak"); 
     user.setAddress("Giderken sağda"); 



     binder.loadAll(); 
    } 

    public IndexController() { 
     // TODO Auto-generated constructor stub 
    } 

    public void onDFG(ForwardEvent event){ 
     System.out.println(this.hashCode()); 
    } 

    public void onASD(ForwardEvent event){ 
     System.out.println(this.hashCode()); 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 
} 

回答

3
  1. 從包含的頁面(DealerEdit.zul)刪除<window title="Dealer Edit" >,因爲它形成了自己IdSpace。不要忘記取消關閉</window>標籤。
  2. 更改您的onASD方法名稱以包含您的Include組件ID,即onASD$DealerEditContent。看來包括也形成自己的IdSpace和轉發事件不會跨IdSpace

這應該工作。

更新1:我剛剛確認Include是一個IdSpace所有者組件,因爲它實現了IdSpace接口,所以這是您的情況中唯一的解決方法。

更新2:我發現了一個更簡單的方法來處理跨不同IdSpace的轉發事件,即使用ZUML文件中的組件路徑指定目標組件。例如,在你的情況,你可以在main.zul頁

<?page id="main" ?> 

指定頁面ID和轉發,而在包括頁面事件,如DealerEdit.zul頁面

<textbox forward="onChange=//main/Dealer.onASD" /> 

代碼的其餘部分將保持相同。

參考:http://books.zkoss.org/wiki/ZK_Developer%27s_Reference/Event_Handling/Event_Forwarding#Using_component_Path

+0

它不適用於我的用例。我有同樣的確切示例,沒有註釋 - 您是否必須使用@Listen註釋來確保它的工作原理? – daitangio

+0

@daitangio在我的答案中,我使用'@ Listen'註釋?也發佈一個新的問題與您的代碼,導致您的問題,讓我們看看,謝謝。 – kachhalimbu