ui:repeat - добавление/удаление элементов из списка не работает должным образом

У меня есть следующий код в моем файле .xhtml

<h:form id="registration3Form">
<h:panelGroup id="terms_outer_panel">
   <h:commandLink styleClass="item-7" 
                    action="#{registerBusinessWizardController.addCourse}" 
                    value="#{msgBundle['registerThirdPage.panel.addSchedule']}">
   </h:commandLink>
   <ui:repeat value="#{registerBusinessWizardController.courses}" var="course">      
                    <h:panelGroup id="terms_inner_panel">
                        <div class="term">

                            <h:inputText id="price" styleClass="item-2" value="#{course.price}" />

                            <h:inputText  id="dateFrom" styleClass="date" value="#{course.date}" >
                                <f:convertDateTime  pattern="yy-MM-dd" type="date" dateStyle="long"/>
                            </h:inputText>

                            <h:inputTextarea value="#{course.additionalInfo}"/>

                            <p class="more">
                                <h:commandLink 
                                    value="#{msgBundle['registerThirdPage.panel.deleteSchedule']}" 
                                    actionListener="#{registerBusinessWizardController.removeCourse}">
                                    <f:ajax render=":registration3Form:terms_outer_panel" execute="terms_inner_panel"/>
                                </h:commandLink>

                            </p>
                        </div>
                    </h:panelGroup>
        </ui:repeat>
    //some other stuff
</h:panelGroup>
</h:form>

И когда страница отображается. И пользователь щелкает ссылку addSchedule. Я ожидаю, что повтор ui добавит новый div class="term" с пустыми значениями, привязанными к входам, потому что:

public void addCourse(){
    Course course = new Course();
    courses.add(course);
}

Я добавляю новый объект курса с нулевой ценой, дополнительной информацией и датой в список, используемый ui:repeat.

Вместо этого я получаю новый

<div class="term"> 

часть со значениями, скопированными из предыдущей записи.

Когда я удаляю элемент из списка (в manageBean правильный объект из списка удаляется), я вижу данные из только что удаленного объекта:/

Кто-нибудь сталкивался с такой проблемой? У тебя есть какой-нибудь совет?


person adrian    schedule 11.12.2011    source источник


Ответы (1)


Похоже, это еще одна <ui:repeat> ошибка. У <ui:repeat> Мохарры слишком много проблем. Первый шаг — исключить компонент из числа подозрительных, заменив его полноценным компонентом UIData, например <h:dataTable>. Если это работает, то это определенно ошибка в <ui:repeat>, в противном случае это просто ошибка в вашем собственном коде (на основе приведенного кода я ничего не вижу, однако я предполагаю, что ваш bean-компонент @ViewScoped).

Если это действительно вызвано самим <ui:repeat>, то первым шагом обычно является обновление до последней версии Mojarra. Это в настоящее время 2.0.6 для контейнеров Servlet 2.5 и 2.1.4 для контейнеров Servlet 3.0. Если это не решит проблему, попробуйте заменить Mojarra на MyFaces, у которого другой и лучший <ui:repeat> выполнение. Если по какой-то причине это невозможно, вам следует рассмотреть возможность поиска сторонней библиотеки компонентов, в которой есть компонент на основе UIData, который не отображает никакой разметки, например Томагавк <t:dataList>.

person BalusC    schedule 12.12.2011