Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 如何使用JSF检测表单中的呈现事件?_Ajax_Jsf - Fatal编程技术网

Ajax 如何使用JSF检测表单中的呈现事件?

Ajax 如何使用JSF检测表单中的呈现事件?,ajax,jsf,Ajax,Jsf,在JSF页面中考虑以下表单: <h:form id="countForm"> <h:outputText value="#{myBean.count}" /> <h:commandButton value="Increment the count!"> <f:ajax listener="#{myBean.increment()}" render="@form" /> </h:commandButton> </

在JSF页面中考虑以下表单:

<h:form id="countForm">
  <h:outputText value="#{myBean.count}" />
  <h:commandButton value="Increment the count!">
    <f:ajax listener="#{myBean.increment()}" render="@form" />
  </h:commandButton>
</h:form>

这段简单的代码将在用户通过ajax请求单击按钮时增加计数器

假设我还想向用户显示一个警报,在表单更新(重新提交)时通知计数器的新值。我该怎么做?有类似下面的代码吗

<h:form onUpdate="alert('the new value is #{myBean.count()}')">

我知道我可以使用primefaces的“oncomplete”方法,但事件将链接到按钮而不是表单,这不是我想要的

计数器不是我想做的,这只是一个简单的例子,可以更好地说明我的问题


提前感谢您的帮助。

请查看
javax.faces.event.PreRenderComponentEvent。

<h:form id="myForm">
  <f:event type="preRenderComponent"
           listener="#{someActionListener}" />
</h:form>


每次(重新)呈现表单时,将首先调用actionListener。

很难提供准确的答案,因为您的确切要求不清楚。
1.您是否尝试了包含
onComplete
事件的
?它没有解决你的问题吗?
2.如果您确实需要在表单重新提交后运行脚本,您可以在表单中放置
标记,并将javascript代码放入其中,如下所示

<h:form id="frm">
  <script>
    alert('#{myBean.count()}');
  </script>
</h:form>
<head>
  <script>
    var showAlert = false;
  </script>
</head> 
<body>
<h:form id="frm">
  <script>
    if(showAlert) {
      alert('#{myBean.count()}');
    }
    showAlert = true;
  </script>
</h:form>
</body>

警报('#{myBean.count()}');
每次呈现表单时都会显示此警报。
请注意,如果需要防止在页面加载时运行此JS,则可能需要添加如下条件

<h:form id="frm">
  <script>
    alert('#{myBean.count()}');
  </script>
</h:form>
<head>
  <script>
    var showAlert = false;
  </script>
</head> 
<body>
<h:form id="frm">
  <script>
    if(showAlert) {
      alert('#{myBean.count()}');
    }
    showAlert = true;
  </script>
</h:form>
</body>

var showart=false;
如果(显示警报){
警报('#{myBean.count()}');
}
showarert=true;

您可以从以下位置使用ajax状态标记组件:
或:
)。这两个组件都处理表单中ajax调用的开始和完成事件

我没有在JSF2应用程序中尝试过这些,但我建议使用PrimeFaces(至少文档比RichFaces好)。我在JSF1.2+RichFaces 3.3应用程序中使用了RichFaces
,向用户显示/隐藏任何ajax请求的对话框。它看起来像这样(并且可以给你一个想法):



有一种方法不是很优雅,但我在没有其他选择的情况下使用它。我使用的
包含
块,我在
呈现=
部分使用panelGroup id,我猜OP在执行ajax方法时要求执行JavaScript方法,而不是另一个服务器端方法。Luiggi是对的,我不想调用另一个服务器端方法,我只想执行一个javascript.OP,它不是使用Ajax4jsf,而是使用JSF2.1。oncomplete事件在特定组件的ajax请求完成时执行,如果有多个组件更新表单,则必须在每个组件中设置oncomplete。我希望将我的javascript操作链接到表单的呈现事件,而不使用“oncomplete”。这正是我想做的!非常感谢你的回答!在表单中编写脚本不是很干净,但是它工作得很好,每次呈现表单时都会执行它!更清楚地说,我不知道您是否已经使用Apache的Tapestry,每次更新组件时,它都会触发一个事件,该事件链接到更新的组件,因此每当更新特定的内容时,都可以很容易地添加行为。ajaxStatus并不理想,但它可以工作。这并不理想,因为此事件链接到每个ajax请求,而不仅仅是更新表单的请求。要对ajaxStatus执行我想要的操作,我应该为页面中未更新表单的每个ajax请求设置“global=false”(primefaces)。这不是最好的解决方案,但它是一个,谢谢。谢谢你的回答,但这不是我想要的。我认为,要完成您试图做的事情,primefaces中的“oncomplete”方法会更好,而不是使用f:ajax和“render”,您可以使用p:ajax并将脚本分配给“oncomplete”事件。在我的情况下,它不起作用,因为我的表单可以由不同的组件更新,我希望无论何时都执行相同的脚本,而不必在每个组件中设置“oncomplete”。