コンポーネントであるテキスト ボックスの変更時に 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
}