PrimeFaces のオートコンプリート コンポーネントに問題があります。私は pojo で使用しているので、コンバーターも作成しました。ここまでは、すべてがクールで正常に動作します。
ただし、ユーザーが要素を選択した後、選択したオブジェクトをパラメーターとして送信する ajax コンポーネントを使用してバッキング Bean を呼び出します。ajax コンポーネントでは、オートコンプリート コンポーネント自体も更新するように設定しましたが、オートコンプリート コンポーネントのフィールド値を選択した pojo の Java アドレスで更新すると問題が発生します。
例: これは住所の正規化サービスであるため、ユーザーが何かを入力し始めたときに既存の住所を提案する必要があります。そのため、ユーザーがフィールドに「john」のような文字を入力し始めると、オートコンプリートにより、他の候補と共に「John Fitzgerald Kennedy, New York, New York」が提案されます。ということで、候補は5つほど。
候補は、住所、郵便番号、地域、州などのプロパティを持つ Address 型のオブジェクトです。
ここまではすべて問題ありません。提案では、提案された住所とそれぞれの地域のみがユーザーに表示されます。そして、これが私が欲しいものです。
ユーザーが提案の 1 つをクリックすると、ajax コンポーネントが呼び出さなければならないものを呼び出し、実行すべきことを実行してから、オートコンプリート コンポーネントとともにいくつかのコンポーネントを更新します。更新前まではすべて正常に機能し、選択したアイテムの正確なラベルがフィールドに表示されます。しかし、フィールドで何か他のものが必要なので、更新を行います。
XHTML:
<p:autoComplete id="address"
value="${normalizationBean.address}" var="result" converter="#{normalizationBean}"
itemLabel="${''.getClass().toString().equalsIgnoreCase(result.getClass().toString()) ? result : result.indirizzo }"
itemValue="${result}" completeMethod="#{normalizationBean.loadSuggestions}"
disabled="#{disabled}" style="width:100%;" styleClass="input indi" immediate="true">
<p:ajax update="cap, regionContainer" listener="#{normalizationBean.setSelectedSuggestion}" event="itemSelect">
<ui:param name="selectedSuggestion" value="${result}" />
</p:ajax>
<p:column>
${result.indirizzo}
</p:column>
<p:column>
${result.localita}
</p:column>
</p:autoComplete>
コンバータ:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value==null || value.equals(""))
return null;
try{
return addressSuggestions.getList().get(Integer.valueOf(value));
} catch(Exception e){
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value==null || value.equals(""))
return null;
return String.valueOf(addressSuggestions.getList().indexOf(value));
}
豆:
@Model
public class NormalizationBean implements Serializable, Converter{
private AddressSuggestionsListType addressSuggestions;
private String address;
public List<AddressSuggestionsType> loadSuggestions(String query) {
// call the service which returns a list of suggestions
AddressSuggestionsListType result = ShellService.instance()
.getSuggestions(query);
if (result == null){
addressSuggestions.setErr("Could not connect to service");
} else {
addressSuggestions= result;
}
}
return addressSuggestions.getList();
}
public void setSelectedSuggestion(SelectEvent selected){
AddressSuggestionsType addType = (AddressSuggestionsType) selected.getObject();
this.address = addType.getAddress();
}
// ...
}
前もって感謝します!:)