我无法使用Primefaces 5.0.8“管理”对象列表。
我想创建具有功能的“表单”:
所有功能都应该在一个页面中,没有任何对话框。对于列表表示,我使用的是primeface“dataTable”组件。我有问题只更新/处理dataTable的一部分然后点击删除按钮。
简化了jsf视图,我想出了:
<p:dataGrid id="myObjectList"
value="#{myManagedBean.myObjectList}"
var="obj"
rowIndexVar="dataGridRowIndex"
columns="1">
<p:outputLabel value="row number: #{dataGridRowIndex}"/>
<h:panelGrid id="parentGrid" columns="2">
<p:outputLabel value="property1" for="property1Input"/>
<p:inputText id="property1Input" value="#{obj.property1}" required="true"/>
<p:outputLabel value="property2" for="property2Input"/>
<p:inputText id="property2Input" value="#{obj.property2}"/>
</h:panelGrid>
<p:commandButton id="removeButton"
icon="ui-icon-minus"
update="myObjectList"
process="@this"
actionListener="#{myManagedBean.myObjectList.remove(obj)}"
rendered="#{myManagedBean.myObjectList.size() > 1}"/>
<p:commandButton id="addButton"
icon="ui-icon-plus"
update="myObjectList"
process="myObjectList"
actionListener="#{myManagedBean.addNewObjectToList()}"
rendered="#{myManagedBean.myObjectList.size() == dataGridRowIndex +1}"/>
<p:separator/>
</p:dataGrid>
简化的托管bean:
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
@Named
@Scope(value = "view")
public class MyManagedBean {
private final List<MyObject> myObjectList = new ArrayList<>();
@PostConstruct
public void init() {
myObjectList.add(new MyObject("test1"));
myObjectList.add(new MyObject("test2"));
myObjectList.add(new MyObject(""));
}
public void addNewObjectToList() {
myObjectList.add(new MyObject());
}
public List<MyObject> getMyObjectList() {
return myObjectList;
}
}
简化的“业务”对象:
public class MyObject {
private String property1;
private String property2;
public MyObject() {
}
public MyObject(String property1) {
this.property1 = property1;
}
public String getProperty1() {
return property1;
}
public void setProperty1(String property1) {
this.property1 = property1;
}
public String getProperty2() {
return property2;
}
public void setProperty2(String property2) {
this.property2 = property2;
}
}
此代码有一个主要问题:
如果用户在第一行输入一些文本到“property1Input”,然后在第二行点击“removeButton”,则输入第一行的值消失(因为所有“myObjectList”都更新,“removeButton”不提交值)< / p>
我无法在“removeButton”上提交值,因为我不想显示验证/转换错误,然后用户点击“removeButton”(示例中的“business”对象被简化)。
我无法为“removeButton”添加'immediate =“true”+'process =“myObjectList”'因为“删除”值“停留”输入组件,所以如果在“删除”用户点击“添加”后他会看到删除了价值。
我找到的唯一可行的解决方法是“removeButton”点击不从列表中删除对象,但在dataTable中隐藏行,但这种解决方法需要大量额外的编码,看起来真的很难看。
对于这个问题,还有其他简单的解决方案吗?