2011-05-06 111 views
0

我在我的网页上有这样的选择/下拉菜单。此下拉菜单应根据选定的项目生成另一个下拉菜单。我这样做的方式是通过拨打电话<f:ajax event="change"..listener=..>JSF呈现不起作用

但这并没有像我期望的那样发生。在下拉菜单中选择项目时,会触发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>' 

,这是bean的功能支持AJAX

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

当我调试,功能工作正常。

+0

如果你在你的ajax命令中使用'render =“@form”'它会工作吗? – 2011-05-06 05:59:16

+0

这个技巧!你介意在ajax标签上更多地解释我吗?另外,这样做的答案,以便我可以评价你。谢谢! – 2011-05-06 07:14:23

+0

@Matt你可以请发表这个答案,以便我可以评价它吗? – 2011-05-06 07:59:28

回答

3

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

IDS通常看起来像id="formId:componentId:nestedComponentId1"id="formId:componentId:nestedComponentId2"

所以一个render="nestedComponentId2"从COMPONENT1称为如果两个IDS具有相同的“预告片”才有效。

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