【发布时间】: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);
}
但是永远不会调用这个监听器。
这就是为什么我做了一些技巧,我将标签更改为 <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;
}
此变体有效。但我不明白为什么以前的带有监听器的变体不起作用。
我的错在哪里?为了正确的结果应该改变什么?
【问题讨论】:
-
是在
<h:form>里面吗?