渲染的JSF不起作用

时间:2011-05-06 04:03:07

标签: java ajax jsf java-ee

我的网页上有这样的内容,一个选择/下拉菜单。此下拉菜单应根据所选项目生成另一个下拉菜单。我这样做的方法是调用<f:ajax event="change"..listener=..>

但它并没有像我预期的那样发生。在下拉菜单中选择项目时,会触发ajax标记中的侦听器,以下下拉列表的rendered属性似乎不受更改的影响。并且rendered的值已成功从false更改为true。哪个......让我想知道我的jsf页面有什么问题。

这是xhtml “                                                                           

                        <h:selectOneMenu value="#{teacher.viewCategory}">
                            <f:selectItem itemValue="0" itemLabel="Tahun" />
                            <f:selectItem itemValue="1" itemLabel="Mata Pelajaran" />
                            <f:ajax event="change" render="divYearSelection divCourseSelection"
                                    listener="#{teacher.enableViewCategory}"/>
                        </h:selectOneMenu>

                        <h:panelGroup id="divYearSelection" layout="block" rendered="#{teacher.showViewYearSelection}">
                            <h:outputText value="YEAR"/>
                        </h:panelGroup>

                        <h:panelGroup id="divCourseSelection" layout="block" rendered="#{teacher.showViewCourseSelection}">
                            <h:outputText value="COURSE"/>
                        </h:panelGroup>


                        <h:commandButton value="#{msg.tcr_form_submit_view}" action="#{teacher.viewTeacher}"/>
                    </h:panelGrid>
                </h:form>' 

这是支持ajax的bean函数

public void enableViewCategory(AjaxBehaviorEvent e) {       
        if (this.getViewCategory().equals("0")) {
            this.setShowViewYearSelection(true);
        } else {
            this.setShowViewCourseSelection(true);
        }
    } 

调试时,该功能正常。

1 个答案:

答案 0 :(得分:4)

如果部分渲染不起作用,一个好的起点是查看页面的html源,因为它在浏览器中呈现。只有当两者(ajax触发组件和目标组件)具有相同的直接父容器时,render="divYearSelection"才会起作用。

渲染的html组件的ID通常看起来像id="formId:componentId:nestedComponentId1"id="formId:componentId:nestedComponentId2"

因此,只有两个ID具有相同的“预告片”时,才能从component1调用render="nestedComponentId2"

您可以尝试使用示例中给出的完整ID,从表单的id开始,或者(如果整个表单不是太大)使用render="@form"更新整个表单。