9

コンポーネントであるテキスト ボックスの変更時に ajax 更新をトリガーする必要があり<p:autoComplete>ます。ユーザーがテキストを手動で入力することを選択した場合、イベントは変更であるのに対し、ユーザーがオートコンプリートの候補の 1 つをクリックした場合、イベントは itemSelect であることがわかりました。そこで、2<p:ajax>つの子を入力に追加しました。それぞれが同じメソッドを呼び出し、同じ更新リストを持ちますが、1 つは ともう 1 つは持っevent="change"ていevent="itemSelect"ます。

しかし、私は今、奇妙なことを発見しました。たとえば、通常のサーバー モードでページを開いて「12」と入力したとします。オートコンプリートは、提案として「1233」と「1234」を提供しました。「1233」をクリックしましたが、何も起こらなかったようです。もう一度クリックすると、他のすべてが入力されました。

イベント ハンドラーにブレークポイントを設定してデバッガーでこれを繰り返すと、最初のクリックで値が "12" になり、2 回目のクリックで "1233" になることがわかります。

2 つの異なるコメント アウトを切り替える<p:ajax>ことで、異なる結果を確認できます。"change" がないと、ユーザーがオートコンプリートの提案を選択した場合にハンドラーが呼び出されることはありません。また、"itemSelect" がないと、ユーザーが手動で入力してもハンドラーが呼び出されることはありません。しかし、どちらも2回の呼び出しがあり、ダブルクリックについての苦情があると思います.

最初に xhtml が好きな人のための疑似コード:

<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}"
    required="true" completeMethod="#{myBacker.idAutoComplete}">
    <p:ajax event="itemSelect" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
    <p:ajax event="change" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
</p:autoComplete>
<h:panelGroup id="beanDetails">
    <h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}">
        <h:outputText value="#{myBacker.myBean.institutionName}" />
        <!-- Continues with address, phone, etc..  -->
    </h:panelGroup>
</h:panelGroup>

次に、Java バッキング Bean コード:

public void idChangeEventListener() {
    myBean = myDAO.getDetails(myBean);
    //  another couple of init-type method calls
}
4

1 に答える 1

13

親タグに widgetVar 属性を与えてから、この小さな属性を<p:ajax event="change" ...>子タグに追加します。

onstart="if(widgetVarName.panel.is(':visible')) return false;" 

質問が書かれたとき、私の記憶が正しければ、私たちは PrimeFaces バージョン 3.5 を使用していました。それ以来、ソリューションを次のように更新する必要があります。

onstart="if(PF('widgetVarName').panel.is(':visible')) return false;"

変更を指摘してくれた mwalter に感謝します。

于 2013-10-18T13:02:11.090 に答える