我们正在从jsf 1.2升级到jsf 2。 我们正在使用apache myfaces 2.1和富面4.3。
<rich:autocomplete>
我们面临着非常奇怪的问题。下面是xhtml代码。
<rich:autocomplete mode="cachedAjax" minChars="2" autocompleteMethod="#{bean.getData}"
var="result" value="#{bean.inputData}">
<h:column>
<h:outputText value="#{result}" />
</h:column>
</rich:autocomplete>
以下是场景,当在自动完成输入框中输入输入时,会显示建议 - 即调用bean.getData方法。 令人惊讶的是,在选择任何建议之后,使用所选的选项值再次调用bean.getData方法,我认为这不是正确的行为 因为用户选择了一个选项而没有输入任何输入。
我不希望再次调用bean.getData方法。还有其他选择吗?
请帮忙。
编辑1 由于我正在运行db查询以获取建议值,因此它们与为获取建议而键入的实际输入值不同。那就是如果我输入“at”,我的sugegstions可能会“检查我”。我理解,一旦搜索前缀发生变化,建议会再次进行评估,但在这里我不会更改前缀,而是选择整个建议值。
编辑2 提供问题所带来的背景。
当调用autoCompleted方法时,它会使用CustomUserObject作为值填充所有建议的hashMap。 以下是此代码:
public List<String> getData(FacesContext context, UIComponent component, String input) {
Map<String, CustomUserObject> userMap = new HashMap<String, CustomUserObject>();
//get users from db
List<CustomUserObject> users = bean.fetchUserList(input);
//put users in map
for (CustomUserObject user : users) {
userMap.put(user.id, user) ;
}
List<String> userList = new ArrayList<String>();
//convert the list to List<String>
if(userList != null && !userList.isEmpty()){
//convert the List<CustomUserObject> to List<String>
}
return userList;
}
现在由于问题中提到的问题,再次调用getData并破坏userMap。 此映射用于通过将其与选定的Suggestion进行比较来检索正确的CustomUserObject,如下所示:
if(userMap != null && !userMap.isEmpty()){
for(CustomUserObject user : userMap.values()){
if(selectedSuggestion != null && selectedSuggestion.equals(user.name)){
//match is found
//set variables to update ui at re-render
}
//no match found
//set variables to update ui at re-render
}
}
编辑3
除了上述问题之外,rich:autocomplete
的{{1}}似乎没有“无标签”属性,当找不到结果时,rich:suggestionBox
会显示该属性。
这个问题以及上述问题确实让这个组件与rich:suggestionBox