在客户端完成之前阻止服务器端事件触发

Prevent Server side event from firing until clientside is done

我有一个包含客户端代码和服务器端代码的按钮。客户端代码包含一个 addCallback 函数,用于根据第一个结果执行其他代码。这一切都很好,但现在我试图在客户端完全完成后将服务器端 JS 添加到 运行。

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

注意:我的 RPC returns 一个字符串 "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);

服务器刷新在此处运行

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 和随附的刷新到 运行 仅在最后。

延迟调用以异步方式执行,因此代码保持运行并触发服务器代码。您需要将此调用更改为 "synchronous" 方式。 (虽然强烈不推荐这样做)

您可以老一套 - 让您的 XPages 按钮不提交并执行您的客户端代码。

有一个带有class选择器的隐藏按钮,它的样式也是display:none

在你的回调中

$('.classSelector).click()

class 选择器添加到您要单击的 XPages 按钮的位置

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