尝试将Richfaces 3.3项目迁移到4。得到了一个rich:suggestionBox组件,并将其转换为一个rich:autocomplete组件,但遇到了重大问题。
要求是:填写部分自动补全,为用户提供合适的选项。当用户从下拉列表中选择某个内容时,组件应更新其值,禁用自身,并在用户可以编辑的辅助字段中计算/更新默认值。到目前为止,我有这个:
<a4j:jsFunction name="jsFunc"
execute="autoComplete"
render="species_name individualUserStr"
actionListener="#{individualsBean.selectedIndividualElem.assignDefaultNickname}"/>
<rich:autocomplete
autocompleteMethod="#{individualsBean.speciesForBox}"
mode="cachedAjax"
layout="table"
var="sp"
id="species_name"
value="#{individualsBean.selectedIndividualElem.userCommonName}"
fetchValue="#{sp.commonName}"
disabled="#{individualsBean.selectedIndividualElem.userCommonName != null
and individualsBean.selectedIndividualElem.userCommonName ne ''}"
onselectitem="jsFunc()"
>
...
</rich:autocomplete>
<h:inputText value="#{individualsBean.selectedIndividualElem.ssi.individualUserStr}"
id="individualUserStr"
maxlength="28"
styleClass="inputTextMediumRF">
</h:inputText>
现在,当用户选择调用jsFunc的东西时,assignDefaultNickname会被调用,一切都很好,除了assignDefault Nickname中用于确定辅助字段individualUserStr的值的计算取决于species_name的值,但在我提交表单之前,species_name不会提交,因此assignDefaultNickname中的计算不正确。
在调用assignDefaultNickname之前,我需要以某种方式调用personalialsBean.selectedIndividualElem.userCommonName上的setter,但我不知道如何做到这一点。AJAX和这个自动完成功能似乎有问题;这也是为什么我必须首先使用这个round-a-but jsFunction组件来调用该方法的部分原因。
关于如何解决这个问题,有什么建议吗?
找到了我自己问题的解决方案。基本上,需要学习如何使用execute属性。其他JSF 2.0 n00bs的教训是使用execute来选择性地重新处理页面。使用execute,您可以制作一个以空格分隔的组件ID列表,这些ID的值应该重新绑定到backingbean,以防它们需要在响应AJAX事件的侦听器中使用。在我的例子中,这意味着更改jsFunction标记如下:
<a4j:jsFunction name="jsFunc"
execute="species_name individualUserStr"
render="species_name individualUserStr"
actionListener="#{individualsBean.selectedIndividualElem.assignDefaultNickname}"/>
正如您所看到的,jsFunction现在在调用assignDefaultNickname函数时,将首先更新绑定到自动完成和inputText组件的值,然后运行assignDefault Nickname。