2012-11-29 134 views
0

我遇到了列表框和組合框行爲的問題。我有一個包含一組行的列表框,我嘗試內聯編輯並根據組合框的值更改字段的值。但是當我在一行的組合中選擇一個值時,其他行的組合框的所有值都變爲相同的值。請讓我知道我做錯了什麼。謝謝你的幫助!ZK ComboBox onchange更改列表框中的所有組合框

這裏是我的代碼:

  <template name="model" var="item"> 
       <listitem > 
        <listcell label="@load(item.id)"/> 
        <listcell label="@load(item.descCodigoTrafico)"/>    
        <listcell label="@load(item.descAmbitoDeTrafico)"/> 
        <listcell> 
         <combobox 
          model="@load(vm.listaPrecioEspecial)" 
          onChange="@command('addToUpdate', entry=item)" 
          selectedItem="@load(item.precioEspecial) @save(item.precioEspecial, before='updateItems')"> 
          <template name="model" var="el"> 
           <comboitem label="@load(el)"/> 
          </template> 
         </combobox> 
        </listcell> 
        <listcell label="@load(item.tipoDescuento)" /> 
        <listcell> 
         <decimalbox inplace="true" 
         value="@load(item.ppm) @save(item.ppm, before='updateItems')" 
         onChange="@command('addToUpdate', entry=item)" 
         format="#.0000"/> 
        </listcell> 
       </listitem> 
      </template> 

和DE VM兩種方法的代碼:

@Command 
public void addToUpdate(@BindingParam("entry") TblEscenarioCondTrafico item){ 
    itemsToUpdate.add(item); 
    LOGGER.info(item.toString()); 
    for(TblEscenarioCondTrafico i : itemsToUpdate){ 
     LOGGER.info("Item a guardar " + i.toString()); 
     //LOGGER.info("Elemento..."); 
    } 
} 

@NotifyChange("listaTraficos") 
@Command 
public void updateItems() throws Exception{ 
    EscenarioCondTraficoService ects = new EscenarioCondTraficoService(em); 
    for (TblEscenarioCondTrafico i : itemsToUpdate){ 
     LOGGER.info("Guardando " + i.toString()); 
     ects.save(i); 
    } 
    itemsToUpdate.clear(); 
    listaTraficos = getListaTraficos(); 
} 

回答

1

的問題應該是

model="@load(vm.listaPrecioEspecial)" 

設置相同的Collection以每個Combobox作爲其模型,因此它必然會被Combobox個實例。

+0

嗨Nabil A.感謝您的回答!這可能是原因。你知道任何避免它的方法嗎?我是否必須爲每一行設置一個新模型? – jherranzm

+1

讓'getListaPrecioEspecial()'返回一個List(?)的副本。但請注意,Java沒有深刻的克隆/複製!因此,如果列表中的對象不是來自支持深度克隆的框架,那麼您不能簡單地創建新實例,也不想實現自己的克隆,如果數據結構不是太複雜,我推薦使用克隆可以使用[this](http://code.google.com/p/cloning/)。如果你這樣做,請閱讀網站上的說明。 –

+0

感謝納比爾A.您的評論。我會盡力讓你知道。數據結構是一個帶有幾個字符串的List,每個頁面大概有十個組合,所以我認爲它不會是一個大數據負載。再次感謝! – jherranzm

0

我有同樣的問題,像Nabil A.說問題是模型,所有的項目相同。我解決了爲每個項目創建一個新模型。 相反的:

model="@load(vm.listaPrecioEspecial)" 

我把這樣的:

model="@load(vm.getNewListaPrecioEspecial()) 

而在你需要創建一個名爲getNewListaPrecioEspecial方法,該方法返回一個新的列表中的VM類。 (在我的情況下,一個新的SortingPagingListModel)