JSF动态创建表单参数不准确

时间:2014-07-31 16:08:16

标签: jsf jsf-2 el

在尝试将动态数据作为侦听器中的参数进行访问时,我遇到了一些奇怪的结果。下面是我的xhtml的片段。我有一个支持bean,skillsController.java和一个pojo Skill.java

ui:repeat正在迭代类别,并为每个类别生成一个dataTable。视觉上一切似乎都正确生成。尝试访问稍后在xhtml中创建的变量时会出现问题。当使用附加到selectonmenu的任何类型的侦听器时,数据表中的技能变量与最初用于生成页面的数据不匹配。例如,提交表单时使用的技能与第一类技能中的数据相关联,而不是它应具有的正确类别/技能。

似乎技能在页面生成和表单提交之间不同步。关于如何在表单提交中获得存储在技能中的正确值,是否有任何建议?

<h:form rendered="#{!skillsController.mode.equalsIgnoreCase('Show My Skills')}">                    
    <ui:repeat var="cat" value="#{skillsController.masterCategories}" varStatus="status">
        <h:panelGroup layout="block" rendered="#{cat.toString().equalsIgnoreCase(skillsController.mode)||skillsController.mode.equalsIgnoreCase('Show All Skills')}">
            <h3 class="arSkillsHeader">
                <h:outputLabel value="#{cat.toString()}"
                    style="font-weight:bold" />
            </h3>
            <h:dataTable style="margin-left:15px; margin-right:15px"
                class="suggestionsTable" var="skill"
                rowClasses="gray, lightgraybg"
                columnClasses="null, hCol3, versionCol, null"
                value="#{skillsController.getSkillsByCategory(cat)}">
                <h:column>
                    <h:graphicImage value="/resources/images/success.png"
                        style="height:20px"
                        rendered="#{skillsController.hasSkill(cat.toString(), skill.name.toString())}" />
                </h:column>
                <h:column>
                    <h:outputText value="#{skill.name.toString()}" />                                           
                </h:column> 
                <h:column>
                    <h:outputText value="#{skill.categoryName}" rendered="false" />
                    <h:outputText value="#{skill.name}" rendered="false" />
                    <h:selectManyCheckbox id = "versionCheckbox"
                                          layout ="lineDirection"
                                          style = "text-align: left;"
                                          value = "#{skill.checkedVersions}"
                                          valueChangeListener="#{skillsController.versionsChecked}">
                        <f:selectItems value="#{skillsController.getVersions(skill.getName(), skill.getCategoryName())}"/>
                    </h:selectManyCheckbox> 
                </h:column>             
                <h:column>
                    <h:selectOneMenu id="proficiency" value="#{skill.proficiency}">
                        <f:selectItem
                            itemValue="#{skillsController.timeList.get(0)}"
                            itemLabel="Select Experience Level" />
                        <f:selectItems
                            value="#{skillsController.timeList.subList(1, skillsController.timeList.size())}" />
                        <f:ajax render="versionCheckbox @this"
                                listener="#{skill.proficiencyUpdated(skill.proficiency)}"/>
                    </h:selectOneMenu>
                </h:column>
            </h:dataTable>
            <h:panelGroup layout="block" style="height:20px">
                <h:commandButton value="Update Category" style="float:right; margin-right:15px;"
                    action="#{skillsController.updateCategorySkills(cat)}"
                    onclick="updatePro(this.id);">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
            </h:panelGroup>
        </h:panelGroup>                         
    </ui:repeat>
</h:form>

0 个答案:

没有答案