【发布时间】:2011-11-09 21:48:49
【问题描述】:
我正在 BalusC's solution 的基础上突出显示和聚焦 JSF 中的字段。我的计划是输出一个带有 id 的 JSON 数组,然后调用一个方法来处理这个数组。当我不使用
这是我的相位监听器解决方案:
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
List<String> highlightFields = new ArrayList<String>();
Iterator<String> highlightFieldsItr = facesContext
.getClientIdsWithMessages();
while (highlightFieldsItr.hasNext()) {
StringBuilder sb = new StringBuilder();
sb.append("#");
sb.append(highlightFieldsItr.next().replaceAll(":", "\\\\:"));
highlightFields.add(sb.toString());
}
JSONArray jsonHighlightFields = new JSONArray(highlightFields);
facesContext.getExternalContext().getRequestMap()
.put("errorFields", jsonHighlightFields.toString());
}
基本上这会产生类似于 ["#some\:id1", "#some\id2"] 的 errorFields 值。然后我可以在我的根布局文件中做这样的事情:
<script>
var errorFields = ${errorFields}; // This will xlate to ["#some\\:id1", "#some\\:id2"
$(document).ready(function(){
processInputErrors(errorFields);
});
</script>
使用这样的 processInputErrors 函数:
function processInputErrors(ids) {
for (id in ids) {
if (focus == false) {
jQuery(ids[id]).focus();
focus = true;
}
jQuery(ids[id]).addClass('input-error');
}
}
但是,我需要以某种方式在 ajax 发布成功时调用的函数中获取此列表。
现在 f:ajax 确实有 onevent 属性并且这个函数确实被调用了,但我不确定它到底传递了什么。我如何能够以某种方式将来自相位侦听器的无效 ID 传递给该函数?似乎传递了一个代表 HTMLInputElement 的对象?
<f:ajax event="change" onevent="test" render="test test_msg" immediate="true" />
很高兴听到其他建议或想法。目标基本上是集中并突出显示无效的字段,不仅在完整的回发中而且在使用 f:ajax 时也是如此。
谢谢!
【问题讨论】: