JSF 2 - ui:repeat 中的自定义输入文本组件问题

Posted

技术标签:

【中文标题】JSF 2 - ui:repeat 中的自定义输入文本组件问题【英文标题】:JSF 2 - Issue with custom input text component inside ui:repeat 【发布时间】:2015-01-19 12:07:30 【问题描述】:

我需要你的帮助......请......

我正在从 JSF 1.2 迁移到 JSF 2.1。

我使用的实现是带有 facelets 的 Sun 的 Mojarra 实现,它在 JSF 1.2 中不是标准的一部分,但由于 JSF 2.0他们成为。

现在我使用 javax.faces.PARTIAL_STATE_SAVING 作为 true。 (尝试使用 false,但我的自定义组件都没有工作。)

我们有一些自定义的 JSF 组件,并且在大多数情况下它们都可以正常工作。但是,以下示例无法正常工作:

<ui:repeat value="#myBean.list" var="item">            
       <tr style="cursor:pointer;">   
             <td class="texttable col_med col15Personal">   
                    <bf:TextBox   
                           compId="aliasName"  
                           value="#item.aliasName"  
                           compStyle="font-size:1em;"    
                           maxLength="15" showAutoLabel="false"/>   
             </td>   
       </tr>   
</ui:repeat>  

bf:TextBox 是一个自定义文本框,它扩展了 HtmlPanelGroup 并具有 2 个自定义子组件:

一个自定义标签(扩展HtmlOutputlabel)和一个自定义输入(扩展HtmlInputText

当这个组件在没有 ui:repeat 的情况下使用时,一切正常。但是,当它进入其中时,就会出现问题。

在第一个渲染响应阶段,一切都很好。但是当你发帖时,在 restoreview 阶段,自定义 HtmlPanelGroup 的子项(标签和 inputText)不存在于 viewRoot 中,因此提交的值不存在。

相同的代码在 JSF 1.2 中可以正常工作。

我知道 ui:repeat 有其他选择(例如 c:forEach),但由于我正在处理迁移过程,因此更改所有内容非常复杂提到的涉及这种类型的代码。

提前谢谢大家,

【问题讨论】:

【参考方案1】:

我找到了解决我的问题的方法。由于主要目标是对应用程序进行最少的更改...我避免更改所有使用 ui:repeat 的页面。相反,我更改了我的自定义组件以将子组件保存到状态持有者(saveState 方法),然后如果组件具有 ui:repeat 作为父组件,我将恢复子组件。

if (getInsideUIRepeat() != null && getInsideUIRepeat().booleanValue())   
            values[42] = this.getChildren();  
          

这是从 saveState 方法中提取的。

 if (getInsideUIRepeat() != null && getInsideUIRepeat().booleanValue())   
           List<UIComponent> children = (List<UIComponent>) values[42];  
            if (children != null)   
                this.getChildren().clear();  
                this.getChildren().addAll(children);  
              
          

这是从 restoreState 方法中提取的。

private boolean hasUIRepeatAsParent()   
    UIComponent parent = this.getParent();  
    while (parent != null)   
        if (parent instanceof UIRepeat)   
            return true;  
          
        parent = parent.getParent();  
      
    return false;  
  

这是检查组件是否有 UIRepeat 作为父级的方法

再次感谢大家...

【讨论】:

以上是关于JSF 2 - ui:repeat 中的自定义输入文本组件问题的主要内容,如果未能解决你的问题,请参考以下文章

没有dataModel的JSF 2 dataTable行索引

使用 JSF ui:repeat 循环执行带状态的逻辑

JSF <ui:repeat> <c:forEach> 复合 UINamingContainer

如何在没有 JSF 标记库(h:datatable 或 ui:repeat)的情况下编写 <table> 标记,但仍使用 JSF 来控制页面流

JSF Primefaces TabView 问题

使用 ui:repeat 输出 ResultSet