0

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

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

任何指针将不胜感激

吉姆

4

1 回答 1

0

复合滥用。

您不能以编程方式修改 cc.attrs 值——它不是使用它的 NamingContainer UIComponent 属性映射来检索的。

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

于 2011-03-21T16:58:12.893 回答