我使用的是Primefaces 4.0和JSF 2.2。当我使用行Edit生成DataTable
,并在rowEdit
事件上设置valdiationFailed()
时,划船器正在关闭,我希望防止这种情况发生。
我添加了一个oncomplete
js函数,比如:
<p:ajax event="rowEdit" listener="#{customerUI.onInvoiceRowEdit}"
oncomplete="if(!args.validationFailed) {updateTable();}" update=":messages" />
我的远程命令如下:
<p:remoteCommand name="updateTable" update=":form:addressTabs:customerTable" />
因此,当验证失败时,这会保留编辑器,但现在编辑器接受和取消按钮不起作用,在我手动刷新之前,编辑其他内容也不起作用。
我只希望编辑器在验证失败时保持不变,并且为了更正输入,如果验证顺利,可以关闭编辑器。
有人能解决这个问题吗?
所以我遇到了一个与此无关的问题,这个问题帮助我找到了解决方案,所以我想我应该在这里分享它,以防其他人遇到类似问题并需要帮助。
因此,当编辑行中的一个单元格时,我对一个函数进行了dataTable和rowEdit ajax调用,在对数据库进行一些更改后,我还使用了remoteCommand来更新dataTable。问题是,如果单元格编辑值的验证失败,remoteCommand将刷新表单,错误消息将在读取之前消失。我希望只有在没有验证错误的情况下才执行对rowEdit的ajax调用,否则我希望在行编辑器仍然打开的情况下显示错误消息。因此,我使用了问题中显示的args.validationFailed参数,以防止在自定义验证器失败的情况下执行remoteCommand。下面是我所做的一个基本例子。
JSF页面:-
<h:form id="form_name">
<p:remoteCommand name="refreshForm" update="@form" />
<p:dataTable id="table_id" var="varTableData"
value="#{bean.tablerows}"
editable="true">
<p:ajax event="rowEdit"
listener="#{bean.onRowEdit}"
oncomplete="if(!args.validationFailed) refreshForm()" />
<p:column>
<f:facet name="header">
<h:outputText value="Column Title" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{varTableData.someValue}" />
</f:facet>
<f:facet name="input">
<p:inputText id="cellId"
value="#{varTableData.someValue}"
label="Some Label" required="true" style="width:100%"
validator="#{bean.validationMethod}">
</p:inputText>
<p:message id="someMsg" for="cellId" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
自定义验证方法:-
public void validationMethod(FacesContext context, UIComponent comp, Object value) {
int someCellValue = (int) value;
if (someCellValue < 6) {
((UIInput) comp).setValid(false);
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Some error message",
"some error message");
context.addMessage(comp.getClientId(context), message);
}
}