我对 PrimeFaces 的自动完成组件有疑问。我将它与 pojo 一起使用,所以我还创建了一个转换器,直到这里一切都很酷并且工作正常。
但是,在用户选择一个元素后,我调用一个带有 ajax 组件的支持 bean,将所选对象作为参数发送。在 ajax 组件中,我还设置了更新自动完成组件本身,当它使用所选 pojo 的 java 地址更新自动完成组件的字段值时,问题就来了。
例如:这是一个地址规范化服务,因此当用户开始输入内容时应该建议一个现有地址。因此,用户开始在字段中输入“john”之类的内容,自动完成提示“John Fitzgerald Kennedy, New York, New York”以及其他建议。所以说大约有5个建议。
建议是具有以下属性的地址类型的对象:地址、邮政编码、地区、州等。
直到这里一切都很好。在建议中,用户只能看到建议的地址及其各自的区域。这就是我想要的。
现在用户单击其中一个建议,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();
}
// ...
}
提前致谢!:)