ui:重复 - 从列表中添加/删除元素无法正常工作

时间:2011-12-11 15:08:37

标签: ajax jsf-2 facelets mojarra uirepeat

我的.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 repeat会添加新的div class =“term” 空值绑定到输入,因为:

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

我正在将新的Course对象与null price additionalInfo和date添加到ui:repeat使用的列表中。

相反,我得到了新的

<div class="term"> 

从上一个条目复制值的部分。

当我从列表中删除元素时(在删除了listBean中的正确对象),我看到刚删除的对象中的数据:/

有人遇到过这种问题吗? 你有什么建议吗?

1 个答案:

答案 0 :(得分:4)

这似乎是另一个<ui:repeat>错误。 Mojarra的<ui:repeat>有太多问题。第一步是通过用一个完整的UIData组件(例如<h:dataTable>)替换组件来排除组件被怀疑。如果它有效,那么它绝对是<ui:repeat>中的一个错误,否则它只是你自己代码中的一个错误(根据我给出的代码,我没有看到任何错误,但我假设你的bean是{{ 1}})。

如果它确实是由@ViewScoped本身引起的,那么第一步通常是升级到最新的Mojarra版本。对于Servlet 2.5容器,这是currently 2.0.6,对于Servlet 3.0容器,这是2.1.4。如果这不能解决问题,那么您应该考虑用MyFaces替换Mojarra,它具有不同且更好的<ui:repeat>实现。如果由于某种原因这不是一个选项,那么您应该考虑查看具有基于<ui:repeat>的组件的第三方组件库,该组件不会呈现任何标记,例如Tomahawk's {{1 }}