动态dataTable表单在使用ajax时删除其数组

时间:2013-07-09 18:32:19

标签: java jsf jsf-2 jsf-2.2

我有一个动态dataTable,用于添加和删除对象。当我不使用ajax时,这很好用。但是,当我使用ajax时,会出现问题。最初添加值很好。但是,当我开始删除对象时,当我删除最后一个对象时,项目列表也会被删除并变为空。我正在使用带有primefaces的jsf 2.2。我不确定是什么导致了这个问题。我的代码如下。

item.xhtml

<h:panelGroup id="list">
    <h:dataTable value="#{item.items}" var="object">
        <h:column>
            <!-- Figure out what these facets are or delete them -->
            <f:facet name="keys">Keys</f:facet>
            <p:inputText value="#{object.x}" />
        </h:column>
        <h:column headerText="Values">
            <f:facet name="values">Values</f:facet>
            <p:inputText value="#{object.y}" />
        </h:column>
        <h:column>
            <h:commandLink value="Delete" action="#{user.removeObject(object)}">
                <f:ajax execute="@form" render="@form" />
           </h:commandLink>
        </h:column>
    </h:dataTable>
    <h:commandButton value="add" action="#{user.addObject}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:panelGroup>

item.java

@ManagedBean
@ViewScoped
public class Item implements Serializable{
    public void addObject(){
        Pair<String,String> tempPair = new Pair<String,String>("","");
        items.add(tempPair);
        return;
    }

    public void removeObject(Pair<String,String> i){
        items.remove(i);
        return;
    }
}

更新1

我尝试使用jsf 2.1,将viewAction更改为preRenderView,我的代码运行正常。

2 个答案:

答案 0 :(得分:0)

我认为ajax缺少更新属性。试试这个:

<f:ajax execute="@form" render="@form" update="@form"/>

答案 1 :(得分:0)

这是jsf 2.2.0中的一个错误。我用javax-faces-2.2.1.jar替换了javax-faces-2.2.0.jar,问题就消失了。

或者,另一种解决方案是将上面的<f:ajax>替换为:

<f:ajax execute="@form" render=":form:list">

显然,只要整个表单没有渲染,ajax调用在jsf 2.2.0中运行正常。