0

JSF と AJAX を考えると問題があります。訪問者が顧客 ID を挿入した後、顧客の詳細を更新しようとしています。

まず、xhmtl コードからの抜粋:

    <h:form>
    <h:panelGrid columns="2">
        <h:panelGrid columns ="2" border="1" id="customer_grid">
            <h:outputLabel value="#{mbean_msg.reservation_lblCustomerNo}" for = "customer_id"/>
            <h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}">
                <f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" 
                    render="customer_grid" />
            </h:inputText>

            <h:outputLabel value="#{mbean_msg.reservation_lblLastname}" for="lastname"/>
            <h:inputText id="lastname" value="#{reservationHandler.customer.lastname}" required ="true" 
                requiredMessage="#{error_msg.errmsgLastname}" validator="#{reservationHandler.validateCustomer}"/>

            <h:outputLabel value="#{mbean_msg.reservation_lblFirstname}" for="firstname"/>
            <h:inputText id="firstname" value="#{reservationHandler.customer.firstname}" required ="true"
                requiredMessage="#{error_msg.errmsgFirstname}" validator="#{reservationHandler.validateCustomer}"/> 

リスナー メソッドは、次のように Java ファイル (ReservationHandler.java) 内に実装されます。

public void autocompleteCustomerDetails(){
      System.out.println("Auto Complete"); // for testing
}

基本的に、リスナーでautocompleteCustomerDetailsメソッドを呼び出そうとしています。残念ながら、このメソッドは呼び出されません。とにかく、他のinputTextsが(目に見えて)自分自身を更新するので、レンダリングはうまくいくようです。

リスナーが呼び出されない理由は誰にもわかりますか?

4

2 に答える 2

8

これまでに示したコードには 2 つの問題があります。

初め、

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />

これは有効な EL 式ではありません。EL 式の形式は#{}、 ではなく{}です。それに応じて修正します。

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />

2番、

public void autocompleteCustomerDetails() {

これは、 のメソッド式の有効なデフォルト シグネチャではありません<f:ajax listener>タグのドキュメントには、次のことが明確に示されています。

署名が一致する必要がありpublic void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingExceptionます。

だから、あなたは議論を忘れました。それに応じて追加します。非チェック例外のthrows宣言は必須ではないため、省略できます。

public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {

または、実際に引数を取り除くつもりなら、EL メソッド式に括弧を入れる必要があります。

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails()}" />

これは、コンテナーが EL 2.2 をサポートしている場合にのみ機能することに注意してください。

于 2012-12-23T16:55:27.530 に答える
0

これを試して:

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}" 
                render="customer_grid" />

または、メソッドを次のように変更します:getAutoCompleteCustomerDetails

テストのためだけに...

とにかく、jsfのコンポーネントライブラリを使用することは許可されていませんか?プライムフェイスのように?それはそのような簡単な方法で仕事を成し遂げます...

とにかく、primefacesで私はこのようにします:

 <p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" />

もう1つの推測は、execute ="@this"をajaxフラグに追加することです...

申し訳ありませんが、これらはすべて大げさな推測ですが、私は本当に助けたいと思っています。フィードバックをお寄せください。

于 2012-12-23T12:25:25.937 に答える