阻止服务器端事件触发,直到客户端完成

时间:2015-04-01 21:45:44

标签: xpages

我有一个包含客户端代码和服务器端代码的按钮。客户端代码包含一个addCallback函数,用于执行依赖于第一个结果的附加代码。这一切都运行正常,但现在我正在尝试添加服务器端JS以在客户端完全完成后运行。

由于某种原因,在调用第一个RPC并跳过其余的客户端代码后,服务器端代码和刷新正在运行。

注意:我的RPC返回字符串“true”或“false”。

message = "Starting Initiate Settlement Process...";
$(".infoMessage").text(message);
atmID = $("input.atmID").val(); //pull from hidden input
settlementCorrectYN = $( "input:checked" ).val();
todayAmt = $( ".todayAmt" ).val();
amtReceived = $( ".amtRec" ).val();

var tranType = "Settlement";
var deferred = atmRPC.closeATMSettle(tranType);
deferred.addCallback(function(result){
    alert("first result=" + result);

SERVER REFRESH RUNS HERE

if (result == "false") {
            message = "Initiate Settlement process failed";
            $(".infoMessage").text(message);
            atmRPC.updateInfoMsg(message);
        } else if (result == "true"){
            var tranType = "Settlement";
            var deferredInner = atmRPC.settleATMInitiate(settlementCorrectYN, tranType, todayAmt, amtReceived, atmID);
            deferredInner.addCallback(function(result){
            alert("inner result=" + result)
            if (result == "false") {
                message = "";
                $(".infoMessage").text(message);
                atmRPC.updateInfoMsg(message);
            } else if(result == "true"){
                message = atmID + " has been successfully Settled."
                $(".infoMessage").text(message);
                atmRPC.updateInfoMsg(message);
            }
            })
        } 
      }
    )

如果服务器刷新是部分刷新或完全刷新,则会发生这种情况。如何强制SSJS和伴随的刷新仅在最后运行。

2 个答案:

答案 0 :(得分:2)

延迟调用以异步方式执行,因此代码继续运行并触发服务器代码。您需要将此调用更改为“同步”方式。 (虽然强烈建议不要这样做)

答案 1 :(得分:1)

您可以上学 - 让您的XPage按钮不提交并执行您的客户端代码。

有一个带有classSelector的隐藏按钮,该按钮也具有display:none

的样式 回调中的

$('.classSelector).click()

将类选择器添加到要单击的XPage按钮

<xp:button id="stevesId" styleClass="classSelector"></xp:button>