0

我尝试在页面上制作 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);
     }

但是永远不会调用此侦听器。

这就是为什么我做了一些技巧,我在<f:ajax event="change" render="tests" />没有监听器的情况下更改标签。

但是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;
    } 

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

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

4

2 回答 2

3

侦听器不是属性。如果您在 java bean 中的方法是getTestBySubjectId(),请将其放在属性中(不需要括号)。

 <f:ajax event="change" render="tests" listener="#{test.getTestsBySubjectId}" />
于 2012-11-12T21:09:56.620 回答
1

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

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

此侦听器调用 ajax 回发。我从这篇文章中理解了这一点。是否可以在回发时禁用 f:event type=“preRenderView” 侦听器?

谢谢@BalusC

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

于 2012-11-12T21:37:35.273 回答