【问题标题】:JSF2 AJAX h:selectOneMenu listener doesn't callJSF2 AJAX h:selectOneMenu 监听器不调用
【发布时间】:2012-11-01 08:07:37
【问题描述】:

我尝试在页面上制作 2 h:selectOneMenu 组件。当我从第一个 selectOneMenu 中选择某个主题时,我想将 ajax 与侦听器一起使用,在该监听器中,我获得了选定主题的 id,并在其他 selectOneMenu 中填写了该主题的列表测试。我使用带有会话范围的 bean。

<f:event type="preRenderView" listener="#{test.getAllSubjects}" />
<h:form prependId="false">          
    <h:panelGroup rendered="#{not empty test.testBean.subjectList}">
                    <h:selectOneMenu value="#{test.testBean.subjectId}" id="subjects">
                        <f:selectItem itemLabel="--Select a subject--" itemValue="0" />
                        <f:selectItems value="#{test.testBean.subjectList}"
                            var="subjectItem" itemValue="#{subjectItem.subjectId}"
                            itemLabel="#{subjectItem.subject}" />
                        <f:ajax event="change" render="tests" listener="#{test.testsBySubjectId}" />                
                    </h:selectOneMenu>

    <h:selectOneMenu value="#{test.testBean.test.testIdentifer.testId}" id="tests">
                    <f:selectItem itemLabel="--Select a test--" itemValue="0" />
                        <f:selectItems value="#{test.testBean.testList}" var="testItem" 
                        itemValue="#{testItem.testIdentifer.testId}" itemLabel="#{testItem.testName}" />                                    
                    </h:selectOneMenu>
    </h:panelGroup>
</h:form> 

并且在托管bean中使用下一个监听器

public void getTestsBySubjectId() throws DAOException {
     Long subjectId = testBean.getSubjectId();
     List<Test> testList = testBo.getTestBySubjectId(subjectId);
     testBean.setTestList(testList);
     }

但是永远不会调用这个监听器。

这就是为什么我做了一些技巧,我将标签更改为 &lt;f:ajax event="change" render="tests" /&gt; 而没有监听器。

但我在h:selectOneMenu 进行了测试

<f:selectItems value="#{test.testsBySubjectId}" var="testItem"
                        itemValue="#{testItem.testIdentifer.testId}"
                        itemLabel="#{testItem.testName}" /> 

然后我从 bean 测试列表初始化值而不是值测试。我尝试初始化为

public List<Test> getTestsBySubjectId() throws DAOException {
        Long subjectId = testBean.getSubjectId();
        List<Test> testList = testBo.getTestBySubjectId(subjectId);
        testBean.setTestList(testList);
        return testList;
    } 

此变体有效。但我不明白为什么以前的带有监听器的变体不起作用。

我的错在哪里?为了正确的结果应该改变什么?

【问题讨论】:

  • 是在&lt;h:form&gt;里面吗?

标签: java ajax jsf jsf-2


【解决方案1】:

监听器不是属性。如果你在java bean中的方法是getTestBySubjectId(),把它(不需要括号)放在属性中。

 <f:ajax event="change" render="tests" listener="#{test.getTestsBySubjectId}" />

【讨论】:

  • 不,它不起作用。当我再次选择主题时,将从位于 &lt;h:form&gt; 之外的 &lt;f:event type="preRenderView" listener="#{test.getAllSubjects}" /&gt; 调用的 bean 中调用 getAllSubjects
  • 我在表格上方添加问题文本和&lt;f:event type="preRenderView" listener="#{test.getAllSubjects}" /&gt;
  • 即使我把 '' 放在&lt;h:form&gt; 中,每次调用ajax请求时都会调用它
  • 能否删除throws 子句?我现在找不到参考,但是我习惯的侦听器的方法签名都没有抛出异常(我认为它可以抛出 javax.faces.event.AbortProcessingException)。
【解决方案2】:

@SJuan76 你是对的。用听众的名字,但我明白我真正的问题。

<f:event type="preRenderView" listener="#{test.getAllSubjects}" />

此侦听器调用 ajax 回发。从这篇文章我明白了。Is it possible to disable f:event type=“preRenderView” listener on postback?

感谢@BalusC

而且我还在监听器方法中添加了 arg AjaxBehaviorEvent event

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2011-07-29
    • 2012-01-30
    • 2014-05-08
    • 2014-06-12
    • 1970-01-01
    • 2011-06-29
    • 2014-03-13
    相关资源
    最近更新 更多