不在<h:selectonemenu> </h:selectonemenu>中重新渲染

时间:2012-10-29 03:33:06

标签: jsf richfaces

我有两个组合框(类别和子类别),我想渲染子类别组合框,这取决于类别组合框的选择ID。但是,子类别组合框不会渲染? 这是我的代码,

<h:panelGrid>
    <h:outputText value="Cateogyr : "/>
    <rich:comboBox defaultLabel="Enter some value" >
      <a4j:support event="onchange" reRender="subCombo" ajaxSingle="true"/>
      <f:selectItems value="#{bookManager.categoryList}" />
    </rich:comboBox>
    </h:panelGrid>

    <h:panelGrid>
    <h:outputText value="Sub Category : "/>
    <rich:comboBox defaultLabel="Enter some value" id="subCombo">
       <f:selectItems value="#{bookManager.subCategoryList}" />
    </rich:comboBox>  
    </h:panelGrid>

我在渲染子类别组合框的辅助bean中打印出来,但它没有出现。 如果您有任何想法,请告诉我。

1 个答案:

答案 0 :(得分:1)

看起来你正在使用JSF 1.2和RichFaces。通过发布的代码,您似乎需要在实际代码中进行一些修复:

  • 您缺少包装要发送到服务器的数据的<h:form>。你的代码应该是这样的:

    <h:form>
        <h:panelGrid>
            <h:outputText value="Category : "/>
            <rich:comboBox defaultLabel="Enter some value" >
              <a4j:support event="onchange" reRender="subCombo" ajaxSingle="true"/>
              <f:selectItems value="#{bookManager.categoryList}" />
            </rich:comboBox>
        <!-- rest of JSF/HTML code... -->
    </h:form>
    
  • 为了正常工作,您的bookManager托管bean需要具有会话范围或请求范围以及@KeepAlive注释才能正常工作。对于性能命中,我建议使用请求范围。你的课应该是这样的

    @KeepAlive
    public class BookManager {
        //class code...
    }
    

看到您的代码,看起来您正在检索bean的getter上的bookManager.subCategoryList(来自数据库或缓存资源)。确保您的托管bean getter和setter非常简单(如public int getNumber() { return this.number; })并且中不包含任何业务逻辑代码,因为JSF可以多次调用getter方法。有关此内容的更多信息,请参阅:

现在,如何解决在更改<rich:combobox>中的值时检索子类别列表的问题?使用action的{​​{1}}组件属性调用在<a4j:support>中检索和准备数据的方法。

JSF代码

bookManager.categoryList

Java代码

<a4j:support event="onchange" reRender="subCombo" ajaxSingle="true"
    action="#{bookManager.obtainSubcategoryList}" limitToList="true" />