在RENDER_RESPONSE期间重新创建复合组件

时间:2011-03-18 22:36:05

标签: jsf-2 composite-component

我正在尝试编写一个复合组件,可以将焦点设置为第一个验证失败的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期间的同一调用显示目标已恢复为使用页面的值。

这是一个错误,还是我滥用/滥用复合材料?

任何指针都将不胜感激

吉姆

1 个答案:

答案 0 :(得分:0)

复合滥用。

你无法编程修改cc.attrs值 - 它不是使用它的NamingContainer UIComponent属性映射检索的。

调整实现以使cc.attr引用我使用c的setBean属性:在复合xhtml中设置为初始化,并且可以通过它的setter在我的监听器中自由更新。