2012-11-29 100 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)