xp:confirm中的值在部分刷新后未更新。为什么?

时间:2018-08-24 08:23:38

标签: xpages xpages-ssjs

在xpage上,我为xp:confirm控件计算消息:

var arr = viewScope.get("attachmentsAll");
if(arr.length>0){
    return "";
}else{
    return arr.length + " Are you sure want to upload the file?";
}

在执行事件之后,将更新viewScope。我通过xp:text进行了检查,我注意到这个假设是正确的。

<xp:text escape="true" id="computedField1"><xp:this.value><![CDATA[#{javascript:var arr = viewScope.get("attachmentsAll")

return arr.length + " number?"}]]></xp:this.value></xp:text>

xp:confirm和xp:text位于事件发生后部分更新的同一面板中。

有人可以解释为什么为什么在xp:text控件中而不是在xp:confirm控件中更新viewScope变量的值吗?

1 个答案:

答案 0 :(得分:1)

我对上一个问题的answer的主要思想是将隐藏的input与计算值一起放入。如果您尝试使用<xp:this.script>而不是xp:confirm,并以相同方式从该隐藏输入中获得确认消息怎么办?

  

更新

不需要对现有xpage进行任何更改的原因和替代解决方案

事实证明,xp:confirm的后端实例正确评估了新消息。甚至将对ajax请求的响应将新值发送到浏览器。但是,XSP客户端模块的功能之一是经过构建的,因此,如果已经存在同名的querySubmit侦听器功能,则它不会更新。因此,我们受困于包含旧消息的旧确认功能。有一种方法可以在不破坏任何其他功能的情况下覆盖此行为。我已经尝试过了,对我有用。

创建一个新的JavaScript库(客户端)。添加代码:

if (!XSP._pushListenerTuned) {
    XSP.__pushListener = XSP._pushListener;
    XSP._pushListener = function x__pl(listeners, formId, clientId, scriptId, listener) {
        if (scriptId && scriptId.endsWith("_confirm")) {
            for (var i = 0; i < listeners.length; i++) {
                if (scriptId == listeners[i].scriptId) {
                    listeners.splice(i, 1);
                }
            }
            listeners.push(new this._SubmitListener(formId, listener, clientId, scriptId));
        } else {
            XSP.__pushListener(listeners, formId, clientId, scriptId, listener);
        }
    }
    XSP._pushListenerTuned = true;
}

通过主题将新库作为全局资源或在所需页面上作为页面资源进行附加。我想将上面的代码作为scriptBlock放在所需的页面上也应该起作用。现在,任何页面(如果您使用主题资源)上,或特定页面上以及访问此页面后的任何地方(如果您使用页面资源或xp:confirm)上的任何scriptBlock组件都将正常工作。