2012-06-20 74 views
1

如果我有2個.zul,一個有一個列表框,另一個是模式窗口。他們可以使用相同的控制器嗎?我只是無法得到它的工作。zk mvc 2 .zul共享相同的控制器

這個問題基本恢復了,我是不是必須在兩個.zul中使用apply="myController"? 如果我這樣做,我得到nullpointerException在myList,因爲我認爲zk實例化2控制器對象,並且該模式不存在myList。但是如果我沒有在modal.zul上應用控制器,當我按下按鈕時沒有任何反應。

我該如何讓2 .zul使用同一個控制器實例?

mail.zul

<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?> 
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?> 
<zk> 
    <hlayout> 
    <div id="winDiv" apply="com.company.controller.ProductController"> 
     <vbox> 
      <listbox id="myList" width="690px" height="300px" > 
       <listhead> 
        <listheader hflex="min" label="id" sort="auto(id)" /> 
        <listheader hflex="2" label="name" sort="auto(name)" /> 
        <listheader hflex="4" label="description" sort="auto(description)" /> 
             <listheader hflex="min" label="opcion"/> 
           </listhead> 
      </listbox> 
     </vbox> 
    </div> 
      <button label="new" id="new"/> 
     </hlayout> 
</zk> 

的modal.zul

<?xml version="1.0" encoding="UTF-8"?> 
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?> 
<window id="modalProductType" title="Nuevo tipo de producto" border="normal" width="420px" 
    closable="true" position="center,center" **apply="com.company.controller.ProductController"**> 

    <grid> 
     <columns> 
       <column hflex="1"/> 
       <column hflex="2"/> 
     </columns> 
     <rows> 
       <row> 
        Clave: 
        <textbox hflex="1" value="@{product.id}" readonly="true"/> 
       </row> 
       <row> 
        Nombre: 
        <textbox id="txtname" value="@{product.name}" hflex="1" tabindex="1" /> 
       </row> 
       <row> 
        Description: 
         <textbox value="@{product.description}" rows="5" hflex="1" tabindex="2" /> 
       </row> 
       <row> 
        <cell colspan="2" style="text-align:center"> 
         <hlayout> 
          <button width="100px" id="save" label="Aceptar"/> 
          <button width="100px" label="close"/> 
         </hlayout> 
        </cell> 
       </row> 
     </rows> 
    </grid> 
</window> 

ProductController.java

public class ProductTypeController extends SelectorComposer { 
@WiredVariable 
    private ProductTypeService productTypeService; 

@Wire 
    private Listbox myList; 

//methods... 

} 

回答

0

不建議這樣做

  1. 爲避免併發性問題(請參閱here)如果相同的控制器實例應用於多個視圖,則有線組件將指向最後一個視圖,從而導致UI的不穩定行爲。僅使用不同的實例而不是編碼併發問題並使控制器線程安全就會更容易。
  2. 爲了避免內存泄漏。例如。如果將相同的控制器實例應用於兩個完全不同的視圖,並且將兩個視圖中的組件連接在一起,那麼如果其中一個視圖未被使用,則其有線組件仍不會被釋放,從而導致內存泄漏。
+0

嗯,如果我使用2個控制器,一個用於模態,其他用於列表。我怎樣才能將模態控制器的信息傳遞給列表控制器以反映變化? – Kossel

+1

您可以使用'EventQueue'或者直接將事件發送到您的列表控制器所應用的div的數據。我個人會建議使用'EventQueue'併爲您的案例參考一個示例[這裏](http://books.zkoss.org/wiki/ZK_Developer%27s_Reference/Event_Handling/Event_Queues#Example:_interactive_between_multiple_ZUL_pages) – kachhalimbu

+0

實際上這應該是部分的答案。這非常有幫助 – Kossel

相關問題