发送Ajax请求时未定义触发事件

时间:2018-01-10 15:34:54

标签: ajax jsf primefaces

我有一个最小的,完整的,可验证的示例按预期工作,有一个问题我还没有完成理解。代码可以在下面看到,其行为基本上包括从PF ajaxified <p:selectOneListbox>的列表中选择一个项目,并在JSF <h:outputText>元素上显示项目的值。

<h:form id="myform">
    <p:selectOneListbox id="myselect" value="#{bean.optionSelected}">
        <p:ajax listener="#{bean.onChange}" process="myselect" update="toupdate" onstart="onstart()" oncomplete="oncomplete()" onerror="onerror()" onsuccess="onsuccess()"/>
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </p:selectOneListbox>    

    <h:outputText id="toupdate" value=">#{bean.optionSelected}" />
</form>

查看该元素,我不知道是什么特定事件导致ajax请求被发送到服务器,也就是说,我不知道触发的事件是否是 valuechange 事件或其他一些事件。换句话说,我想念以这种方式编码的<p:ajax>元素:

<p:ajax event="name_of_the_event" .../>

这个疑问让我不知道支持bean方面的监听器方法所使用的接收事件的类: public void onChange(??? event)

任何澄清/解释都会非常感激。感谢。

1 个答案:

答案 0 :(得分:1)

根据<p:ajax listener="..." />内的PrimeFaces dropdown showcase <p:selectOneListbox />,当用户选择其他项目(onchange)时,event会调用该侦听器。

ajax tag documentation表示p:ajax属性是可选的,并且:

  

触发ajax请求的客户端事件。默认值由行为附加到的父ClientBehaviorHolder组件定义。

如果您想

<p:ajax listener="#{myBean.onAjaxAction}" />标记中的侦听器不需要包含任何参数
  • 使用默认事件作为参数
  • 调用方法
  • 调用不带任何参数的方法

所以public void onAjaxAction(){ ... }

会打电话

javax.faces.event.AjaxBehaviorEvent

如果没有其他方法具有更匹配的方法签名。

如果您想了解有关该事件的更多信息,可以让EL标识和服务器端添加事件。作为参数的每个具体事件应该扩展public void onAjaxAction(javax.faces.event.AjaxBehaviorEvent event) { System.out.println(event.getClass()) }

System.out...

然后,您可以检索事件源。如果您需要更多信息(如果可用),则需要使用更具体的事件类。如果您不知道具体的默认事件(及其相应的类)是什么,您可以添加上面的方法并在方法中尝试检查具体事件(如在<p:selectOneListbox />中所做的那样)

对于许多PrimeFaces组件,文档中提到了事件。并且所有现有的PrimeFaces事件(对于所有组件)都可以找到in the org/primefaces/event package,因此在IDE中使用代码完成可以为您提供选项(请注意,并非所有组件中的所有组件都显然)。

如果文档中没有明确命名的事件,那么基本的dom事件至少应该起作用,包括onchange。输入'onchange'最常见的是默认事件。

由于onchange没有文档中提到的显式事件,因此触发ajax请求的默认事件将为javax.faces.event.AjaxBehaviorEvent。为此,如果需要,class SubmitBallotForm(forms.ModelForm): class Meta: model = CompleteBallot fields = '' 应该用作参数。