【问题标题】:Partial refresh fires the addOnLoad event in XPage部分刷新触发 XPage 中的 addOnLoad 事件
【发布时间】:2013-08-02 06:08:05
【问题描述】:

在我的 XPage 中,我的脚本块中有一个 addOnLoad。但问题是即使在我不想要的部分刷新期间它也会触发。例如如果我在数据表上有一个寻呼机控件,那么单击页面会触发 addOnLoad 函数。 dojo.addOnLoadXSP.addOnLoad 都会发生这种情况。

dojo.addOnLoad(function() {
    console.log("addOnLoad");
});

每次进行部分刷新时都会打印“addOnLoad”。我什至尝试用这种方式修改代码,但没有成功。

var addOnLoadFired = false;
dojo.addOnLoad(function() {
    if (addOnLoadFired) {
        return;
    }
    addOnLoadFired = true;
    console.log("addOnLoad");
});

如何避免这种情况?

【问题讨论】:

  • 将脚本块移出部分刷新的区域。
  • 我认为这不是原因。我的例子是我创建了一个数据表和一个与之关联的寻呼机控件。当使用寻呼机控件在页面之间切换时,addOnLoad 会执行。并且脚本块不驻留在数据表中。
  • Hack解决方案:代码第一次运行时,在viewScope中写点东西,在运行代码前检查一下?
  • @AaronBrake:但viewScope 是 SSJS,我的代码是客户端 JavaScript。
  • 然后可以将值写入隐藏字段并检查。

标签: javascript dojo xpages


【解决方案1】:

在不指定刷新 ID 的情况下进行部分刷新时,整个 XPage 都会被刷新。如果您刷新 UIViewRoot 元素,也会发生同样的情况。在这两种情况下,这都包括您的输出脚本块,这就是为什么您的 addOnLoad 事件会一次又一次地触发。

寻呼机自动刷新其父组件。如果您的 Pager 刚刚添加到您的 XPage,它将始终刷新 UIViewRoot。

要解决您的问题,您可以将 dataTable 和 pager 嵌入 xp:div 元素中。另一个想法是在执行部分刷新时检查输出脚本块的渲染属性。

编辑: 以编程方式检查部分刷新 (SSJS):

var ajax = new com.ibm.xsp.ajax.AjaxUtil();
if( ajax.isAjaxPartialRefresh(facesContext) == true){
    return "AJAX";
}else{
    return "NOT AJAX!"
}

【讨论】:

  • <xp:div> 中嵌入我的数据表和寻呼机不起作用。如何签入页面已部分刷新的rendered 属性?
  • 您可以在 Firebug 或 IE/Chrome 的其他开发人员工具中看到它 - 刷新后查看网络部分。响应包含整个页面(完全刷新)或仅包含部分刷新组件的 html 的一部分。那是我的评论:如果您将脚本移出刷新的 html,它将无法运行。正如 Sven 指出的那样,您似乎已经完全刷新了。
  • @Naveen:更新了我的答案。
  • @Naveen:你设置了div的id了吗?
  • @SvenHasselbach:我设置了<xp:div> 的ID,它起作用了。万分感谢! :)
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多