根据 JSF 2.3,您可以使用<h:commandScript>
它。另见规范问题 613。
<h:form>
<h:commandScript name="foo" action="#{bean.action}" render="div-to-render" />
</h:form>
function clickAndRender() {
foo();
}
它从Mojarra 2.3.0-m06开始可用。
该答案在问题发布3年后更新为以上。以下是原始答案,可以追溯到<h:commandScript>
不存在的时候。
我不知道'source'参数的值(上面的代码使用'this')应该是什么
它应该是UICommand
您想要调用的组件的客户端 ID,例如标准 JSF API 提供的<h:commandLink>
、<h:commandButton>
等。这样,JSF 将在应用请求值阶段能够在组件树中定位所需的组件,然后将所有注册在其上的操作(侦听器)排队。
我也不知道最后一个参数中的执行应该设置为什么。
它应该是您希望在表单提交期间处理的组件的以空格分隔的客户端 ID。它与您通常在<f:ajax execute>
.
我也不知道如何定义要调用的 url
只是当前页面,由组件嵌套所在的<form>
生成的派生。但您不需要在. 将已经根据组件的客户端 ID 确定它。<h:form>
UICommand
jsf.ajax.request()
jsf.js
UICommand
和“行动”方法。
只需按照通常的方式指定目标组件的action
oractionListener
属性即可。UICommand
总而言之,您的具体问题很可能是UICommand
视图中没有任何组件,因此您不能使用jsf.ajax.request()
. 一种方法是创建一个带有命令组件的表单,该组件被 CSS 隐藏display:none
:
<h:form id="foo" style="display:none">
<h:commandLink id="bar" action="#{bean.method}" />
</h:form>
然后你可以foo:bar
用作source
参数。
jsf.ajax.request('foo:bar', null, {'javax.faces.behavior.event': 'action', 'execute': '@form', 'render': 'div-to-render'});
以上内容与命令组件中的效果相同<f:ajax execute="@form" render="div-to-render">
。您也可以选择这条路径,然后使用document.getElementById("foo:bar").click()
而不是jsf.ajax.request()
.
或者,您也可以创建一个自定义UICommand
组件,让 JavaScript 用户更轻松。JSF 实用程序库OmniFaces有这样一个组件,即<o:commandScript>
. 另请参阅其展示页面和源代码。JSF 组件库PrimeFaces也有一个类似的<p:remoteCommand>
. 另请参阅其展示页面。RichFaces具有<a4j:jsFunction>
相同的功能。另请参阅其展示页面。