我正在尝试编写一个复合组件,可以将焦点设置为第一个验证失败的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>
我的侦听器中的以下代码是在After 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;
在BeforeId.RENDER_RESPONSE之前调用mgr.getAttributes()。get(“target”)继续显示失败的ID,但After PhaseId.RENDER_RESPONSE期间的同一调用显示目标已恢复为使用页面的值。
这是一个错误,还是我滥用/滥用复合材料?
任何指针都将不胜感激
吉姆
答案 0 :(得分:0)
复合滥用。
你无法编程修改cc.attrs值 - 它不是使用它的NamingContainer UIComponent属性映射检索的。
调整实现以使cc.attr引用我使用c的setBean属性:在复合xhtml中设置为初始化,并且可以通过它的setter在我的监听器中自由更新。