【问题标题】:ZK ComboBox onchange changes all comboboxes in the listboxZK ComboBox onchange 改变列表框中的所有组合框
【发布时间】:2012-11-29 16:31:23
【问题描述】:

我对列表框和组合框的行为有疑问。我有一个包含一组行的列表框,我尝试编辑内联并根据组合框的值更改字段的值。但是,当我在一行的组合中选择一个值时,其他行的组合框的所有值都会更改为相同的值。请让我知道我做错了什么。感谢您的帮助!

这是我的代码:

            <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();
}

【问题讨论】:

    标签: combobox inline onchange zk


    【解决方案1】:

    问题应该是这样的

    model="@load(vm.listaPrecioEspecial)"
    

    将相同的Collection 设置为每个Combobox 作为其模型,因此它绑定到所有Combobox 实例。

    【讨论】:

    • 嗨,Nabil A。感谢您的回答!这可能是原因。你知道有什么方法可以避免吗?我必须为每一行设置一个新模型吗?
    • getListaPrecioEspecial() 返回列表的副本 (?)。但请注意,Java 没有深度克隆/复制!因此,如果您列表中的对象不是来自支持深度克隆的框架,您不能简单地创建新实例并且您不想实现自己的克隆,我建议,如果数据结构不太复杂,您可以使用this。如果您这样做,请阅读网站上的说明。
    • 感谢 Nabil A. 的评论。我会尽力让你知道。数据结构是一个包含几个字符串的List,每页大约有十个combo,所以我假设它不会有很大的数据负载。再次感谢!
    【解决方案2】:

    我遇到了同样的问题,就像 Nabil A. 说的问题是模型,所有项目都一样。我解决了为每个项目创建一个新模型。 而不是:

    model="@load(vm.listaPrecioEspecial)"
    

    我放了类似的东西:

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

    在 VM 类中,您必须创建一个名为 getNewListaPrecioEspecial 的方法,该方法返回一个新列表。 (在我的例子中是一个新的 SortingPagingListModel)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多