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 is でメソッドを実行する場合は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、リスナーメソッドに引数を追加します

于 2012-11-12T21:37:35.273 に答える