我正在使用JSF 1.2和RichFaces 3.3.3。我在使用Twitter Bootstrap设计的页面上工作。我需要处理这样的订单上的一个动作:在网页上的操作按钮action not a4j:commandButton with a4j:support onclick event
- 用户点击,
- 一个模式对话框打开,并要求用户确认操作(如果用户取消操作,当然过程在这里结束),
- 如果确认,对话框的内容会从确认文本更改为其他内容以跟随动作处理(在某些情况下,例如在代码中显示进度条简单地等待文本),
- 当动作完成时,对话框消失。
所以我需要在同一时间做两件事,交替对话内容并在页面bean中启动一个动作。今天,我可以使对话框内容改变,但在我的bean中启动的动作未被处理... 为此,我在我的bean中使用一个标志来切换对话框内容,并由a4j修改:在执行动作的a4j:commandButton中支持onclick(在正常调用动作之前执行)。
<a4j:commandButton
type="button"
value="#{common.COMMON_Confirm}"
styleClass="btn btn-danger"
action="#{orderDetailBean.cancelOrder}"
oncomplete="showCancelOrderModal(false);">
<a4j:support
event="onclick"
actionListener="#{orderDetailBean.startProcessingMainAction}"
reRender="cancelOrderForm" />
</a4j:commandButton>
也许这种做法是错误的...... 我成功地使这项工作只有一次!现在我花了很多时间让它重新工作,一些帮助应该很棒。请注意,自从几周以来,我一个人学习了JSF和RichFaces。
现在,代码。
在我的网页的一些代码下面,首先启动该过程的按钮(通过javascript函数打开对话框),然后是Twitter Bootstrap对话框本身。
<!-- Main action button -->
<h:form>
<a4j:commandButton
id="cancelOrder"
styleClass="btn btn-danger btn-large"
style="width: 100%; margin-bottom: 7px;"
value="#{app.ACTION_OrderCancel}"
oncomplete="showCancelOrderModal(true);"
reRender="cancelOrderForm" />
</h:form>
<script type="text/javascript">
function showCancelOrderModal(visible) {
jQuery(function($) {
$('#cancelOrderModal').modal(visible ? 'show' : 'hide');
});
}
</script>
<!-- Cancel order modal -->
<div class="modal modal-narrow modal-small hide fade" id="cancelOrderModal">
<div class="modal-header">
<h3>
<h:outputText value="#{app.MODAL_CancelOrderTitle}" />
</h3>
</div>
<a4j:form id="cancelOrderForm">
<a4j:outputPanel
id="cancelOrderConfirm"
rendered="#{!orderDetailBean.processingAction}">
<div class="modal-body">
<p>
<h:outputText value="#{app.MODAL_CancelOrderConfirm}" />
</p>
</div>
<div class="modal-footer">
<a href="#"
class="btn btn-primary"
data-dismiss="modal">
#{common.COMMON_Cancel}
</a>
<a4j:commandButton
type="button"
value="#{common.COMMON_Confirm}"
styleClass="btn btn-danger"
action="#{orderDetailBean.cancelOrder}"
oncomplete="showCancelOrderModal(false);">
<a4j:support
event="onclick"
actionListener="#{orderDetailBean.startProcessingMainAction}"
reRender="cancelOrderForm" />
</a4j:commandButton>
</div>
</a4j:outputPanel>
<a4j:outputPanel
id="cancelOrderWait"
rendered="#{orderDetailBean.processingAction}">
<div class="modal-body">
<h:outputText value="#{app.MODAL_CancelWait}" />
</div>
</a4j:outputPanel>
<a4j:poll
id="cancelOrderPoll"
interval="1000"
enabled="#{orderDetailBean.processingAction}"
reRender="cancelOrderPoll, cancelOrderWait" />
</a4j:form>
</div>
和代码在我的豆
private boolean processingAction;
public void startProcessingMainAction(ActionEvent event) {
logger.debug("Set processing order main action to TRUE");
processingAction = true;
}
public String cancelOrder() {
logger.debug("Start to cancel order with id " + order.getId());
try {
processingAction = true;
cancelProductionOrder(order.getId());
}
catch (Exception e) {
logger.error("Unable to cancel production order" + order.getId(), e);
addErrorMessage("An error occured cancelling order: " + e.getMessage(), null);
return "error";
}
finally {
processingAction = false;
}
return "";
}
那么,是什么在执行发生什么呢?
对话框打开后,用户确认对话框内容交替(所以a4j:支持效果很好),但是因为a4j:commandButton动作没有被调用,所以它的oncomplete被立即执行,我的对话框消失。
我希望你能帮助我,这是我的UI的一个重要组成部分,截止日期是在本周结束^ _^
更新我观察到一个随机的行为。很少(现在是2次),但有时候,所有工作都很好,并且在99%的命令按钮动作不被调用时:/
为什么你需要'startProcessingMainAction()'?这在给出的例子中是没有意义的。 – BalusC
也许你想实现类似于删除按钮[这个演示](http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=editDataTable),但使用一个' '。此外,还有一个基于jQuery组件的[''](http://livedemo.exadel.com/richfaces-demo/richfaces/modalPanel.jsf),不需要重新发明轮子(甚至更容易保持)。 –