我正在实施一个注册地址的对话框。在街道名称字段中,我使用PrimeFaces&#39; <p:autoComplete>
标记可帮助用户找到其街道的名称。 completeMethod
按预期工作,但为了避免类似街道名称之间的混淆,我希望下拉列表还包括给定街道所在的市政当局,例如格式为"<street name>, <municipality name>"
。
我不希望市政名称包含在实际字段中,所以我得出结论我需要一种执行某种字符串操作的方法(使用第一个逗号位置的子字符串,例如),但我无法弄清楚这种方法的调用方法。我已经浏览了PrimeFaces的文档,但我还没有找到任何可以让我这样做的东西。在<p:autoComplete>
中这是否完全可以?或者,是否有另一个支持此功能的自动完成实现,或者我是否必须实现自己的javascript组件?
编辑:这就是我使用的xhtml代码:
<div class="form-group row required">
<h:outputLabel value="#{msgs['@common.mailingAddress']}" for="address" styleClass="col-xs-12"/>
<p:autoComplete
id="address"
name="address"
size="50"
maxlength="50"
styleClass="col-xs-12 street-name"
label="#{msgs['@common.search']}"
disabled="#{not configurationController.cardCtrl.editable}"
value="#{configurationController.cardCtrl.selected.address}"
required="true"
completeMethod="#{configurationController.cardCtrl.autoCompleteTest}">
<f:validator binding="#{onlyLettersOrDigitsValidator}"/>
</p:autoComplete>
<h:message id="addressMessage" for="address" styleClass="inline-error inline-error-small"/>
</div>
控制器中的autoCompleteTest
方法如下:
public List autoCompleteTest(String input) {
AddressSearch addressSearch = AddressSearch.builder()
.streetName(input)
.municipality(municipality.getName())
.maxResultsPerPage(10)
.build();
return addressesToStreetNames(mapService.addressSearch(addressSearch).getAddresses());
}
使用辅助方法addressesToStreetNames
获取Address对象列表并返回包含这些地址的ArrayList<String>
&#39}。街道名称。
EDIT2:根据评论中的建议,我尝试将itemValue
和itemLabel
设置为不同的值,看看是否有任何影响。新的xhtml如上所示,增加了以下三行:
var="address"
itemValue="#{address.streetName}"
itemLabel="#{configurationController.cardCtrl.formatAddress(address.streetName, address.postTown)}"
autoCompleteTest方法现在也直接返回Address对象,而不是街道名称的String表示,以便这些字段可用。 formatAddress方法只是return streetName + ', ' + postTown;
这会导致下拉列表看起来我希望它看起来如何,但当我点击一个项目时,它仍然将整个字符串与街道名称和邮政城镇/市镇插入文本字段(事实上,在我之前写了任何东西,文本字段已包含&#34;,&#34;)。