Ajax 如何使用JSF检测表单中的呈现事件?
在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> </
<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”。