Xpages xp中的值:部分刷新后未更新确认。为什么?

Xpages xp中的值:部分刷新后未更新确认。为什么?,xpages,xpages-ssjs,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

在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位于事件后部分更新的同一面板中

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

我对上一个问题的主要想法是使用计算值来隐藏输入。如果您尝试使用xp:confirm而不是xp:confirm,并以相同的方式从隐藏的输入中获取确认消息,会怎么样

更新

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

结果表明,xp:confirm的后端实例正确地评估了新消息。新的值甚至与对ajax请求的响应一起发送到浏览器。但是XSP客户机模块的其中一个函数被构建,这样,如果已经存在同名的querySubmit侦听器函数,它就不会更新该函数。因此,我们只能使用包含旧消息的旧确认函数。有一种方法可以在不破坏任何其他功能的情况下覆盖此行为。我试过这个,它对我有效

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

如果XSP.U推送器{ XSP.uuPushListener=XSP.pushListener; XSP._pushListener=函数x_upllisteners,formId,clientId,scriptId,listener{ 如果scriptId&&scriptId.endsWith\u确认{ 对于变量i=0;i通过主题将新库作为资源全局附加,或作为所需页面上的页面资源附加。我想把上面的代码作为scriptBlock放在一个必需的页面上也应该可以。现在,任何xp:如果您使用主题资源,请确认任何页面上的组件;如果您使用页面资源或脚本块,请确认特定页面上的组件;在访问此页面后的任何地方,如果您使用页面资源或脚本块,请确认组件都将正常工作。

我不确定,但我的直觉是事件顺序和行动地点。xp:confirm不是服务器端事件,因为您不能在服务器端提示用户响应。这是一个服务器端计算,然后将响应写入浏览器,以便在下次按钮触发部分刷新时运行。希望这能帮助你追踪什么时候设定的。我以为我写了一篇关于CSJ和服务器端计算的博文,但谷歌不是我在这方面的朋友!