ページに 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;
}
このバリアントは機能します。しかし、リスナーを使用した以前のバリアントが機能しない理由がわかりません。
私のせいはどこですか?そして、正しい結果を得るには何を変更する必要がありますか?