我正在尝试编写一个复合组件,可以将焦点设置到第一个验证失败的 UIINput。
我的问题是 RENDER_RESPONSE 正在从它的 xhtml 重新创建我的复合组件,而不是简单地对我在 PROCESS_VALIDATIONS 期间更新的实例进行编码。我正在使用 Mojarra 2.0.4 (FCS b09)
复合实现是
<h:outputScript name="jfocus.js" library="js" target="head"/>
<h:panelGroup layout="span" id="jimo-FocusMgr">
<script type="text/javascript">
jimo.FocusMgr.request("#{cc.attrs.target}");
</script>
</h:panelGroup>
我的侦听器中的以下代码是在 PhaseId.PROCESS_VALIDATIONS 之后设置组合的目标属性,并将组合的(唯一)子项添加到 renderIds 列表中。调试输出显示prevEntry是使用页面设置到组件中的值,failedId是无效UIInput的clientId()。
//set the target attribute of the composite component
Object prevEntry = mgr.getAttributes().put("target", failedId);
if(log.isDebugEnabled())
log.debug("Set mgr's target attribute='"+failedId
+"', previously='"+(prevEntry==null ? "null" : prevEntry.toString()+"'"));
PartialViewContext pvc = fc.getPartialViewContext();
Collection<String> renderids = pvc.getRenderIds();
//update target has to be an official component in the DOM, so append the child panelGroup ID
if(!renderids.contains(mgr.getClientId()))
pvc.getRenderIds().add(mgr.getClientId()+UINamingContainer.getSeparatorChar(fc)+MGR_ID);
//first invalid component wins
break;
在 PhaseId.RENDER_RESPONSE 之前调用 mgr.getAttributes().get("target") 继续显示 failedID,但在 PhaseId.RENDER_RESPONSE 之后的相同调用显示目标已恢复为使用页面的值。
这是一个错误,还是我滥用/误用复合材料?
任何指针将不胜感激
吉姆