我希望用户能够在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函数
中我错过了什么让用户期望这项工作?
答案 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}"
。