根据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起可用。
在问题发布后的三年以上,此答案已更新。以下是原始答案,该日期可以追溯到
<h:commandscript>不存在时。
我不知道’source’参数的值(上面的代码使用’this’)应该是什么
它应该是
UICommand您要调用的组件的客户端ID
,例如
<h:commandlink>,
<h:commandButton>标准JSF
API提供的,等。这样,JSF将在“应用请求值”阶段期间能够在组件树中定位所需的组件,然后将在其上注册的所有动作(侦听器)排队。
我也不知道应该将最后一个参数中的执行设置为什么。
它应该是您要在表单提交期间处理的组件的以空格分隔的客户端ID。与您通常在中使用的完全相同
<f:ajax execute>。
我也不知道如何定义要调用的网址
只是当前页面(从嵌套组件
<form>的
<h:form>位置所生成的页面)派生而来
UICommand。但是您无需在中指定它
jsf.ajax.request()。该
jsf.js会已确定其基础上的客户端ID
UICommand组件。
以及“行动”方法。
只需以通常的方式指定目标组件的
actionor
actionListener属性即可
UICommand。
总而言之,您的具体问题很可能是
UICommand视图中没有任何组件,因此您不能使用
jsf.ajax.request()。一种方法是让表单包含一个被CSS隐藏的命令组件
display:none:
<h:form id="foo" > <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>功能相同。另请参见其展示页面。



