使用PrimeFaces管理对象列表5

时间:2014-09-18 17:18:02

标签: jsf primefaces

我无法使用Primefaces 5.0.8“管理”对象列表。

我想创建具有功能的“表单”:

  1. 将新对象添加到列表
  2. 从列表中删除对象
  3. 编辑列表中的任何对象
  4. 所有功能都应该在一个页面中,没有任何对话框。对于列表表示,我使用的是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() &gt; 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中隐藏行,但这种解决方法需要大量额外的编码,看起来真的很难看。

    对于这个问题,还有其他简单的解决方案吗?

0 个答案:

没有答案