我尝试在页面上制作2小时:selectOneMenu组件。当我从第一个selectOneMenu中选择一个主题时,我想在监听器中使用ajax,我在其他selectOneMenu中为id主题选择主题和填充列表测试。我使用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;
}
此变体有效。但是我不明白为什么以前带有监听器的变体不起作用。
我的错在哪里?什么应该改变正确的结果?
答案 0 :(得分:3)
听众不是财产。如果java bean中的方法是getTestBySubjectId()
,请在属性中添加(不需要括号)。
<f:ajax event="change" render="tests" listener="#{test.getTestsBySubjectId}" />
答案 1 :(得分:1)
@ SJuan76你是对的。听众的名字,但我理解我的真正问题。
<f:event type="preRenderView" listener="#{test.getAllSubjects}" />
此侦听器调用ajax回发。我从这篇文章中了解到这一点。Is it possible to disable f:event type=“preRenderView” listener on postback?
谢谢@BalusC
我还在侦听器方法
中添加了argAjaxBehaviorEvent event