I try to make 2 h:selectOneMenu component on the page. When I choose some subject from the first selectOneMenu I want to use ajax with listener where I get id selected subject and fill list tests for this subject in other selectOneMenu. I use bean with session scoped.
<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>
And in managed bean Use next listener
public void getTestsBySubjectId() throws DAOException {
Long subjectId = testBean.getSubjectId();
List<Test> testList = testBo.getTestBySubjectId(subjectId);
testBean.setTestList(testList);
}
But this listener will never be called.
That’s why I made some tricks I change tag as <f:ajax event="change" render="tests" /> without listener.
But in h:selectOneMenu for test I did
<f:selectItems value="#{test.testsBySubjectId}" var="testItem"
itemValue="#{testItem.testIdentifer.testId}"
itemLabel="#{testItem.testName}" />
And there I initialize value not values tests from bean test list. I try to init as
public List<Test> getTestsBySubjectId() throws DAOException {
Long subjectId = testBean.getSubjectId();
List<Test> testList = testBo.getTestBySubjectId(subjectId);
testBean.setTestList(testList);
return testList;
}
This variant works. But I don’t understand why previous variant with listener doesn’t work.
Where is my fault? And what should be changed for right result?
@SJuan76 You are right. With name of listener but I understand my real problem.
This listener calls on ajax postback. I understand this from this article.Is it possible to disable f:event type=“preRenderView” listener on postback?
Thanks @BalusC
And I also add arg
AjaxBehaviorEvent eventin listener method