JSF中的异步验证器

加布加

我有一个包含编辑框和按钮的简单表单:

<h:form id="addForm">
    <h:outputLabel value="Add item here" /><br />
    <p><h:inputText id="itemInput" value="#{myController.itemToAdd}" validator="myValidator" />
    <h:message for="itemInput" /></p>
    <h:commandButton value="Add" action="#{myController.addItemToList}">
        <f:ajax execute="@form" render="@form :addedItems" />
    </h:commandButton>
</h:form>

当用户单击按钮时,将完成一些基本验证,如果一切正常,则将该项目添加到数据表中:

<h:panelGrid id="addedItems">
    <h:dataTable value="#{myController.itemMap.entrySet()}" var="itemMapEntry" >
        <h:column>
            <f:facet name="header">
                <h:outputText value="Items" />
            </f:facet>
            <h:commandButton value="Remove/Modify" action="#{myController.removeItemFromList(itemMapEntry.getKey())}">
                <f:ajax render=":addedItems :addForm" />
            </h:commandButton>
            <h:outputText value="#{itemMapEntry.getKey()}" />
        </h:column>
        <h:column>
            <f:facet name="action">
                <h:outputText value="" />
            </f:facet>
            <h:outputText value="#{itemMapEntry.getValue().toString()}" id="itemValidationStatus" />
        </h:column>
    </h:dataTable>
</h:panelGrid>

现在,我要实现的是用户输入项目时,首先进行初步验证,如果验证成功,则将项目添加到表中,列表与验证状态(例如,验证,无效)一起显示。 , 有效的)。将项目添加到表中时,另一个耗时的验证开始,并且验证完成后,表中的itemValidationStatus也会更新。我不想在耗时的验证期间阻止用户。相反,我想允许用户在验证已添加的项目的同时添加更多的项目。

我看到三种解决方法:

  1. 要注册将对对象做出反应的某种JS观察器,正在托管Bean中进行更新

  2. 要从托管Bean触发渲染,这将可能产生验证线程,该线程将在完成后触发渲染

  3. 有一些方法可以通过JS异步启动验证并注册一个回调函数,该函数将触发呈现或直接更新值

问题是我找不到任何可以指引我正确方向的在线信息。我正在尝试使用普通的JSF(没有Prime Faces或类似工具)解决此问题。

编辑:

有人向我提出了另一个可能重复的问题(JSF,使用ajax定期刷新组件吗?)。我不是在寻找一种定期轮询的解决方案,而是在基础数据发生更改时进行更新。而且它只会更改一次,因此显而易见的解决方案将是事件侦听器或类似事件。当然,这也可以通过定期民意测验来解决,但是对于我所追求的而言,这似乎是一个很低的水平。

加布加

现在,我通过以下更改解决了它(受此JQuery相关问题的启发,即如何从jQuery触发JSF渲染):

  1. onevent="validateItemList"<f:ajax>表单标签中添加了:

    <h:form id="addForm">
        <h:outputLabel value="Add item here" /><br />
        <p><h:inputText id="itemInput" value="#{myController.itemToAdd}" validator="myValidator" />
        <h:message for="itemInput" /></p>
        <h:commandButton value="Add" action="#{myController.addItemToList}">
            <f:ajax execute="@form" onevent="validateItemList" render="@form :addedItems" />
        </h:commandButton>
    </h:form>
    
  2. 我添加了带有隐藏按钮的隐藏表单,该表单触发了耗时的验证并重新呈现了该表:

    <h:form id="hiddenForm">
        <h:commandButton value="" action="#{myController.validateItemMap}" id="validatorButton" style="display:none">
            <f:ajax execute="@form" render=":addedItems" />
        </h:commandButton>
    </h:form>
    
  3. 我添加了一个回调JS函数,用于“按下”隐藏的按钮:

    <script type="text/javascript">
        function validateItemList(data){
            if(data.status == "success"){
                document.getElementById("hiddenForm:validatorButton").click();
            }
        }
    </script>
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JSF中的验证

来自分类Dev

Angular 2 异步验证器

来自分类Dev

angularjs 1.2中的异步验证

来自分类Dev

<h:inputText>仅在JSF中通过验证后才执行焦点侦听器

来自分类Dev

@Email休眠验证器注释在JSF 2 Bean中不起作用

来自分类Dev

未在ui:repeat中触发JSF 2.2自定义验证器

来自分类Dev

Sequelize.js-异步验证器

来自分类Dev

异步验证器(AsyncValidatorFn)从未订阅

来自分类Dev

Angular 2异步验证器始终无效

来自分类Dev

找不到角度异步验证器对象

来自分类Dev

改变异步验证器的运行方式

来自分类Dev

如何在Angular2 / 4/5中实现自定义异步验证器

来自分类Dev

异步自定义验证器不起作用并在Angular 8中显示错误消息

来自分类Dev

在异步验证器中调用时,Angular服务始终未定义

来自分类Dev

在使用反应形式取消Angular中的输入字段后如何触发异步验证器?

来自分类Dev

在JSF实体中验证持续日期

来自分类Dev

JSF2中的验证程序问题

来自分类Dev

JSF中的输入文本字段验证

来自分类Dev

在JSF中验证类级别的bean验证约束

来自分类Dev

Scalatra中的异步身份验证

来自分类Dev

在 GWT 中验证多个异步方法

来自分类Dev

如何验证异步函数中的对象数组?

来自分类Dev

单个输入字段的定制JSF验证器消息

来自分类Dev

Hibernate验证器程序约束声明和JSF

来自分类Dev

JSF 2.2控制器验证-似乎不触发

来自分类Dev

jsf 2.2 + Spring 4 JSR-349,使用带有JSF Locale的Spring验证器

来自分类Dev

jsf 2.2 +使用Spring验证器和JSF语言环境的Spring 4 JSR-349

来自分类Dev

Angular 2异步自定义验证器

来自分类Dev

Angular2模板驱动的异步验证器