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>

И код двух методов в де ВМ:

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

person jherranzm    schedule 29.11.2012    source источник


Ответы (2)


Проблема должна быть в том, что

model="@load(vm.listaPrecioEspecial)"

устанавливает один и тот же Collection для каждого Combobox в качестве своей модели, поэтому он привязывается ко всем экземплярам Combobox.

person Nabil A.    schedule 29.11.2012
comment
Привет Набиль А. Спасибо за ваш ответ! Это может быть причиной. Знаете ли вы какой-нибудь способ избежать этого? Нужно ли устанавливать новую модель для каждой строки? - person jherranzm; 30.11.2012
comment
Пусть getListaPrecioEspecial() вернет копию списка (?). Но имейте в виду, что в Java нет глубокого клонирования/копирования! Поэтому, если объекты в вашем списке не из фреймворка, поддерживающего глубокое клонирование, вы не можете просто создавать новые экземпляры и не хотите реализовывать клон самостоятельно, что я рекомендую, если структура данных не слишком сложна, вы можно использовать это. Если вы это сделаете, пожалуйста, прочитайте инструкции на сайте. - person Nabil A.; 30.11.2012
comment
Спасибо Набиль А. за ваш комментарий. Я постараюсь и дам вам знать. Структура данных представляет собой список с несколькими строками, и на каждой странице будет около десяти комбинаций, поэтому я предполагаю, что это будет небольшая нагрузка данных. Спасибо еще раз! - person jherranzm; 30.11.2012

У меня была такая же проблема, как сказал Набиль А., проблема была в модели, одинаковой для всех предметов. Я решил создать новую модель для каждого элемента. Вместо:

model="@load(vm.listaPrecioEspecial)"

Я ставлю что-то вроде:

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

И в классе VM вы должны создать метод с именем getNewListaPrecioEspecial, который возвращает новый список. (В моем случае новая SortingPagingListModel)

person Óscar Beses Carmona    schedule 23.01.2018