尝试从p:dataTable中删除行只删除最后一行而不是当前行

时间:2014-09-12 05:15:50

标签: jsf-2 primefaces datatable

我希望用户能够在p:inputText中添加和删除p:dataTable行,一旦用户准备好,就会提交并保存信息。

我的代码添加和保存没有问题。问题是当用户想要删除这些行时,它只删除最后添加的inputText,无论哪个"删除"按下按钮。

form.xhtml

<p:commandButton value="+" 
                 action="#{quoteRequestForm.addQuotation}" 
                 immediate="true" 
                 update="supplier_form"
                 />
        <p:dataTable border="0" 
                     value="#{quoteRequestForm.quotations}" 
                     var="p"
                     rowIndexVar="rowIndex" 
                     emptyMessage="#{text['quoteRequest.noSupplier']}" 
                     id="supplier_form"
                     >
            <p:column>
                 <h:inputText id="vendorName" 
                              value="#{p.vendorName}" 
                              styleClass="form-control" 
                              required="true" maxlength="255"
                              />
            </p:column>
            <p:column>
              <p:commandButton value="remove" 
                               action="#{quoteRequestForm.removeElement(p)}"
                               update="supplier_form" 
                               immediate="true"
                               />
            </p:column>
        </p:dataTable>

托管bean:

@Component("quoteRequestForm")
@ViewScoped
public class QuoteRequestForm extends BasePage implements Serializable {
   private List<Quotation> quotations = new ArrayList<Quotation>();
....
...
 public void addQuotation(){
        Quotation q = new Quotation();
        q.setSupplier(supplierList.get(0));
        quotations.add(q);
    }


    public void removeElement(Quotation q){
        if (log.isDebugEnabled()) {
            log.debug("Quotation supplier to delete: " + q.getVendorName());
        }
        this.quotations.remove(q);
    }

...
}

调试还显示&#34; q.getVendorName()= null&#34;在removeElement函数

我错过了什么让用户期望这项工作?

1 个答案:

答案 0 :(得分:1)

它可以正常工作(不同的变量名称,但原理相同):

<h:form id="formId">
    <p:commandButton value="+" action="#{testMB.addItem}" 
        immediate="true" update="tableId"/>
    <p:dataTable border="0" value="#{testMB.problemList}" var="p"
        rowIndexVar="rowIndex" id="tableId">
        <p:column>
             <h:inputText id="description" value="#{p.description}"
                 required="#{param['formId:save']!=null}" maxlength="255"/>
        </p:column>
         <p:column>
            <p:commandButton value="remove" actionListener="#{testMB.removeItem(p)}" update="tableId"/>
        </p:column>
    </p:dataTable>
    <p:commandButton id="save" value="Save"
        action="#{testMB.saveItems}" update="tableId"/>
</h:form>

如果您使用process="@this",则无论何时想要删除行,都无法保留已设置的输入值,所有inputText值都将被重置,这是我们绝对不想要的。另一方面,如果您不在此代码中使用process="@this"并且至少有一个inputText值为空,则验证会因required="true"而失败,并且您无法删除任何没有填充所有inputTexts的行。所以,我们只在按下保存按钮时进行验证,如required="#{param['formId:save']!=null}"