我有一个最小的,完整的,可验证的示例按预期工作,有一个问题我还没有完成理解。代码可以在下面看到,其行为基本上包括从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)
任何澄清/解释都会非常感激。感谢。
答案 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 = ''
应该用作参数。