如何在PrimeFaces中使用EL完成属性,该属性在动作方法期间更新

Ana*_*oly 4 jsf el primefaces jsf-2

这是代码:

 <p:ajax event="eventResized" process="@this calendar"  listener="#{bean.eventResized}" oncomplete="resizeComplete()"/>
Run Code Online (Sandbox Code Playgroud)

eventReized调用由EventResizeBehavior哪个扩展而来AjaxBehaviorEvent,它包含一些属性.我可以检查内部<p:ajax....>调用它的值并将结果传递给oncomplete="resizeComplete(result)"

这样的事情

<p:ajax event="eventResized" process="@this calendar"  listener="#{bean.eventResized}" oncomplete="resizeComplete(#{eventResized.id == 0})"/>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 7

PrimeFaces不支持它.oncomplete属性中的任何EL表达式在该HTML文档的呈现响应期间立即被评估,而不是在关联的ajax调用的未完成期间.基本上,oncomplete属性生成的JavaScript代码包含页面加载期间的旧值.

您最好的选择是RequestContext#addCallbackParam()将属性添加到范围内args可用的PrimeFaces特定对象oncomplete.

RequestContext.getCurrentInstance().addCallbackParam("result", eventResized.getId() == 0);
Run Code Online (Sandbox Code Playgroud)
<p:ajax ... oncomplete="resizeComplete(args.result)" />
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用RequestContext#execute()而不是以oncomplete编程方式指示PrimeFaces在完成ajax请求时执行一段JavaScript.

RequestContext.getCurrentInstance().execute("resizeComplete(" + (eventResized.getId() == 0) + ")");
Run Code Online (Sandbox Code Playgroud)

  • 别客气。我想指出的是,RichFaces 支持该构造,正如您直觉所期望的那样,如果 PrimeFaces 也这样做,那确实会很好。 (2认同)