JSF:我动态添加的元素没有反应

时间:2012-07-31 19:29:18

标签: jsf

这个问题似乎很简单,但我没有发现错误。

好的,我们走了:我有一张带有IP列表的表格(无论如何),
IP n :[INPUT-FIELD] [按钮“添加”]
IP n + 1 :[INPUT-FIELD] [按钮“添加”]
这些IP从一开始就存在。 它们在Managed Bean的构造函数中初始化。

当我点击“添加”按钮时,将验证当前的IP。之后 我在我的java.util.List和另一行中添加了另一个条目 JSF表单出现:

IP n + 2 :[INPUT-Field] [按钮“添加”]

等等。

添加一行(使用新IP)并验证当前IP 完美适用于现有值 IP n IP n + 1 , 但验证和添加不适用于动态 添加 IP n + 2 。既不验证动态生成的输入字段 使用新创建的“添加”按钮,也可以添加另一行。

我做错了什么?

<h:form id="frmSpecial" prependId="false">
    <h:panelGroup id="tblDestFw">
        <c:forEach items="#{bean.fwdest}" var="fwdest">
            IP: <h:inputText value="#{fwdest.ip}" validator="#{bean.validateIP}"/>
            <h:commandButton action="#{bean.addFwDest()}" 
                             value="&gt;&gt;" title="Add another line">
                <f:ajax execute="@this" render="tblDestFw"/>
            </h:commandButton>
            <br/>
        </c:forEach>
    </h:panelGroup>
</h:form>

@ManagedBean(name = "bean")
@ViewScoped
public class EnterNewSystemFW implements Serializable {
     List<FirewallDest> fwdest;
     public EnterNewSystemFW() {
         fwdest.add(new FirewallDest("N"));
         fwdest.add(new FirewallDest("N+1"));
     }

     public void addFwDest() {
         fwdest.add(new FirewallDest());
     }
}

感谢。

贝恩德

1 个答案:

答案 0 :(得分:0)

对于添加新行,您的<c:forEach>引用了一个视图范围的bean属性。由于JSF issue 1492,此bean在每个请求上重建。

将其替换为普通的JSF组件,例如<ui:repeat><h:dataTable>,它将按预期工作。

<ui:repeat value="#{bean.fwdest}" var="fwdest">
    ...
</ui:repeat>

对于执行验证,您的<f:ajax execute="@this">仅处理当前组件(命令按钮),而不处理输入。请改用<f:ajax execute="@form">来处理整个表单。

另见:

相关问题