我有一个复合组件,看起来像这样:
<!DOCTYPE html>
<html 
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:dm="http://davemaple.com/dm-taglib"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:a4j="http://richfaces.org/a4j">

<cc:interface>
    <cc:attribute name="styleClass" />
    <cc:attribute name="textBoxStyleClass" />
    <cc:attribute name="inputTextId" />
    <cc:attribute name="labelText" />
    <cc:attribute name="tabindex" />
    <cc:attribute name="required" default="false" />
    <cc:attribute name="requiredMessage" />
    <cc:attribute name="validatorId" />
    <cc:attribute name="converterId" />
    <cc:attribute name="title"/>
    <cc:attribute name="style"/>
    <cc:attribute name="unicodeSupport" default="false"/>
    <cc:attribute name="tooltip" default="false"/>
    <cc:attribute name="tooltipText" default=""/>    
    <cc:attribute name="tooltipText" default=""/>
    <cc:attribute name="onfail" default=""/>
    <cc:attribute name="onpass" default=""/>
</cc:interface>

<cc:implementation>

        <ui:param name="converterId" value="#{! empty cc.attrs.converterId ? cc.attrs.converterId : 'universalConverter'}" />
        <ui:param name="validatorId" value="#{! empty cc.attrs.validatorId ? cc.attrs.validatorId : 'universalValidator'}" />
        <ui:param name="component" value="#{formFieldBean.getComponent(cc.attrs.inputTextId)}" />
        <ui:param name="componentValid" value="#{((facesContext.maximumSeverity == null and empty component.valid) or component.valid) ? true : false}" />
        <ui:param name="requiredMessage" value="#{! empty cc.attrs.requiredMessage ? cc.attrs.requiredMessage : msg['validation.generic.requiredMessage']}" />
        <ui:param name="clientIdEscaped" value="#{fn:replace(cc.clientId,':','\\\\\\\\:')}" />

        <h:panelGroup layout="block" id="#{cc.attrs.inputTextId}ValidPanel" style="display:none;">
            <input type="hidden" id="#{cc.attrs.inputTextId}Valid" value="#{componentValid}" />
        </h:panelGroup>

        <dm:outputLabel for="#{cc.clientId}:#{cc.attrs.inputTextId}" id="#{cc.attrs.inputTextId}Label">#{cc.attrs.labelText}</dm:outputLabel>
        <dm:inputText 
            styleClass="#{cc.attrs.textBoxStyleClass}"
               tabindex="#{cc.attrs.tabindex}"
               id="#{cc.attrs.inputTextId}"
               required="#{cc.attrs.required}"
               requiredMessage="#{requiredMessage}"
               title="#{cc.attrs.title}"
               unicodeSupport="#{cc.attrs.unicodeSupport}">
            <f:validator validatorId="#{validatorId}" />
            <f:converter converterId="#{converterId}" />
            <cc:insertChildren />
            <f:ajax 
                event="blur" 
                execute="@this" 
                render="#{cc.attrs.inputTextId}ValidPanel #{cc.attrs.inputTextId}Msg" 
                onevent="on#{cc.attrs.inputTextId}Event" />
        </dm:inputText>
        <rich:message for="#{cc.clientId}:#{cc.attrs.inputTextId}" id="#{cc.attrs.inputTextId}Msg" style="display: none;" />
        <script>
            function on#{cc.attrs.inputTextId}Event(e) {
                if(e.status == 'success') {
                    $('##{clientIdEscaped}\\:#{cc.attrs.inputTextId}').trigger($('##{cc.attrs.inputTextId}Valid').val()=='true'?'pass':'fail');
                }
            }
            $('##{clientIdEscaped}\\:#{cc.attrs.inputTextId}').bind('fail',function() {
                $('##{clientIdEscaped}\\:#{cc.attrs.inputTextId},##{clientIdEscaped}\\:#{cc.attrs.inputTextId}Label,##{cc.attrs.inputTextId}Msg,##{cc.id}Msg').addClass('error');
                $('##{cc.id}Msg').html($('##{clientIdEscaped}\\:#{cc.attrs.inputTextId}Msg').html());
                #{cc.attrs.onfail}
            }).bind('pass',##{cc.id}Msg').removeClass('error');
                $('##{cc.id}Msg').html($('##{clientIdEscaped}\\:#{cc.attrs.inputTextId}Msg').html());
                #{cc.attrs.onpass}
            });
        </script>
        <a4j:region rendered="#{facesContext.maximumSeverity != null and !componentValid}">
            <script>
                $(document).ready(function() { 
                    $('##{clientIdEscaped}\\:#{cc.attrs.inputTextId}').trigger('fail');
                });
            </script>
        </a4j:region>
</cc:implementation>

</html>

我希望能够添加一个可选的“监听器”属性,如果已定义,它将为我的f:ajax添加一个事件监听器,但我无法弄清楚如何实现这一点.任何帮助,将不胜感激.

您需要指定 <cc:attribute>标记的method-signature属性,以便将属性值视为方法表达式.您可以使用JSTL视图构建时标记< c:if>有条件地添加< f:ajax>标签.
<cc:interface>
    <cc:attribute name="listener" method-signature="void listener()" />
</cc:interface>
<cc:implementation>
    <h:someComponent>
        <c:if test="#{cc.getValueExpression('listener') != null}">
            <f:ajax listener="#{cc.attrs.listener}" />
        </c:if>
    </h:someComponent>
</cc:implementation>

(#{not empty cc.attrs.listener}将不起作用,因为EL将隐式地将属性评估为值表达式)

然后你可以使用它如下:

<my:someComposite listener="#{bean.listener}" />

或者当您的环境不支持EL 2.2时,请创建一个支持组件:

@FacesComponent("someComponent")
public class SomeComponent extends UINamingContainer {

    public boolean isHasListener() {
        return getValueExpression("listener") != null;
    }

}

哪个被宣布并用作

<cc:interface type="someComponent">
    <cc:attribute name="listener" method-signature="void listener()" />
</cc:interface>
<cc:implementation>
    <h:someComponent>
        <c:if test="#{cc.hasListener}">
            <f:ajax listener="#{cc.attrs.listener}" />
        </c:if>
    </h:someComponent>
</cc:implementation>

JSF 2 – 在f:ajax上具有可选侦听器属性的复合组件的更多相关文章

  1. Prime Faces错误消息以不同的样式显示

    我正在使用JSF2.3Mojarra和PrimeFaces7开发一个基于web的应用程序。我的问题是错误消息,我将其定义为根据我当前显示的页面,以不同的样式播种。我怀疑这是由于我使用的某些自定义样式,但我不确定。我有以下情况:1.)显示两条消息,其中一条消息在显示后不久消失。这一次,其中一个文本为白色,背景为红色,而另一个文本则为红色,背景为白色:3.)而且,我还有两个案例3a中。有没有一种方法可以像中的情况那样显示所有消息?

  2. 正则表达式 – 使用JSF 2/PrimeFaces中的正则表达式进行电子邮件验证

    我有一个输入字段采用电子邮件地址:如何使用JSF2/PrimeFaces中的正则表达式将输入的值验证为有效的电子邮件地址?

  3. jsf – 仅在第二次点击时调用操作

    我想提交一个按钮点击的数据表,但该操作在第一次单击时不会被调用.这是我的代码:问题是,在第二次点击我的调用动作.但是在第一次点击时不会调用它.有任何想法吗?

  4. 使用AJAX的JSF表单帖子

    我希望以下表单使用AJAX.因此,在单击命令按钮并且不重新加载页面后,将显示注释.使用JavaServerFaces2.0需要更改什么?

  5. 使用AJAX更新JSF / Primefaces数据表中的单行

    使用AJAX时,如何更新p:datatable中的单行?我不想更新整个数据表,因为它有很多行,而且需要一些时间.我的布局:我尝试了一些像update=“clearance”等的东西,但它似乎没有用.我正在使用JSF2.1和Primefaces5.2您可以使用@row搜索表达式来实现这一点–它会更新表中的第n行.要更新当前行,您需要将行索引作为参数传递.在上设置rowIndexVar=“rowIdx”属性接着:

  6. jsf – 如何通过ajax验证两个密码字段?

    首先,使用真实的Validator验证输入.不要在动作事件方法中执行.对于你的具体问题,你只需要指定的执行属性中的两个字段,它只默认为当前组件.如果您将验证器附加到第一个输入,并将第二个输入的值作为

  7. jsf – 级联p:未设置selectOneMenu模型值

    .编辑:面-配置如果托管bean被@RequestScoped放置在请求范围内,则会发生这种情况.每个HTTP请求都会创建一个全新的bean实例,所有属性都设置为default.这样list变为空,因此在模型中没有设置值.通过@ViewScoped将bean放在视图范围中应该可以解决这个问题.也可以看看:>Howtochoosetherightbeanscope?

  8. JSF 2.0 AJAX:使用jsf.ajax.request(或其他方法)从javascript调用bean方法

    一些背景:我正在构建一个自定义的JSF组件.该组件基本上是一个文本编辑器,它应该有一个“保存”按钮来保存编辑器的内容字符串.当我使用CodeMirror库时,我需要使用javascript从编辑器中获取内容(字符串),并将其发送到服务器.因此,在这种情况下,我不能使用基于XML的JS调用,如f:ajax.问题:我打算用jsf.ajax.request发送字符串,但是它并不直接支持调用bean的方法.如何使用JSF以AJAX的方式调用bean中的方法?

  9. 在制作JSF Ajax请求时显示加载进度

    提出请求时,如何显示一些加载消息?

  10. JSF动态包括使用Ajax请求

    3在JSF2中,是否可以更改ui的src的值:使用Ajax请求动态地包含?谢谢.这就是我现在所拥有的是否可以使它成为Ajax?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部