我有一个动态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,我的代码运行正常。
答案 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中运行正常。