检查数据 table 中的任何 celleditor 是否处于编辑模式

Check any celleditor in a data table is in edit mode

我有一个数据 table 显示一些具有 3 列的应用程序参数: 名称(输出文本), 值(p:cellEditor)和 编辑(使用 p:rowEditor)

单击任何行值字段中的编辑按钮后,将转换为输入字段并附加验证器。更改并接受(单击复选图标)值后,页面底部会提供一个 'update button' 以保存所有更改。

我的问题是,如果出现验证错误,我们按 'update button',然后调用转到具有旧值的托管 bean 中的保存函数。因此,为了停止这种情况,我想在任何行打开编辑模式时禁用 'update button'。我可以检查第 2 列中所有单元格编辑器的模式吗,所以我将在更新按钮的禁用属性中使用它。 请建议还有其他更好的方法吗?

使用 jsf 2.1 和 primefaces 3.5

XHTML 片段

        <!-- Body panel for display of individual configuration mode -->
        <p:panel id="mainConfigPanel" >
        <!-- status message section -->
        <p:messages id="msg" autoUpdate="true" closable="true"/>
        <!-- Parameter configuration mode -->
            <p:panel
                rendered="#{configMBean.configUtility.configParamModeOn}"
                styleClass="panelNoBorder">
                <p:dataTable id="configParamTable" var="configParamVar"
                    value="#{configMBean.configParamList}" editable="true">

                    <p:ajax event="rowEdit" listener="#{configMBean.onRowEdit}" update=":mainForm:msg" />
                    <p:ajax event="rowEditCancel" listener="#{configMBean.onRowCancel}"  update=":mainForm:msg" />

                    <p:column headerText="Parameter Name" sortBy="#{configParamVar.paramConfigName}">
                        <h:outputText id="paramNameId" value="#{configParamVar.paramConfigName}" />
                    </p:column>


                    <p:column headerText="Param Value" sortBy="#{configParamVar.paramConfigValue}">
                        <p:cellEditor>
                            <f:facet name="output" > <h:outputText value="#{configParamVar.paramConfigValue}" /> </f:facet>
                            <f:facet name="input">
                                <p:inputText id="paramValueId" value="#{configParamVar.paramConfigValue}" required="true"
                                    validator="#{configMBean.validateParam}"   >
                                    <f:validateLength maximum="2000" />
                                    <f:attribute name="input" value="#{configParamVar}" />
                                </p:inputText>
                            </f:facet>
                        </p:cellEditor>
                    </p:column>

                    <p:column headerText="Edit" style="text-align:center;vertical-align:top;width:20px">
                        <p:rowEditor />
                    </p:column>

                </p:dataTable>


                <h:panelGrid columns="2" >
                    <p:commandButton value="Update Parameters" actionListener="#{configMBean.saveParamUpdate}" update=":mainForm" />
                    <p:commandButton value="Cancel" actionListener="#{configMBean.cancelParamUpdate}" immediate="true" update=":mainForm">
                    </p:commandButton>
                </h:panelGrid>
            </p:panel>
            <!-- End of Parameter configuration mode panel -->


</p:panel>
<!-- End of body panel for individual configuration mode -->

    </p:panelGrid>
    <!-- end of main panel -->

托管 Bean 中的函数

public void onRowEdit(RowEditEvent event) {
    System.out.println(" In Row Edit");
}

public void onRowCancel(RowEditEvent event) {
    System.out.println("In Row Canel of Parameter Config");
}

public void validateParam(FacesContext facesContext, UIComponent component,
        Object value) throws ValidatorException, Exception {
    if (value != null) {
        //Getting  parameter Name and Value for validation
        String paramName = ((RowEntity) component.getAttributes().get("input")).getParamConfigName();
        String paramValue = (String) value;
        FacesMessage msg = null;

        //Validation Cases
        if (paramName.equalsIgnoreCase(ResourceBundle.getMsg("Param_Enable_FTP"))) {
            if (!paramValue.equalsIgnoreCase("true") || !paramValue.equalsIgnoreCase("false")) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, ResourceBundle.getMsg("Param_True_False_Validation")+ paramName, "");
                throw new ValidatorException(msg);
            }
        } else if (paramName.equalsIgnoreCase(ResourceBundle.getMsg("Param_Contingency_Reserve"))) {
            if (!Pattern.matches("-?\d*\.?\d*", paramValue)) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_WARN, ResourceBundle.getMsg("Param_Number_Validation") + paramName, "");
                    throw new ValidatorException(msg);
                }
        }// end if else if

    }

}

来自文档:rowEdit

有一个 Ajax 行为事件
rowEdit | org.primefaces.event.RowEditEvent | When a row is edited.

您可以在触发 RowEditEvent 时禁用更新按钮,并在取消或保存行编辑后释放按钮。

希望我答对了您的问题,这对您有所帮助。