部分刷新触发 XPage 中的 addOnLoad 事件

Posted

技术标签:

【中文标题】部分刷新触发 XPage 中的 addOnLoad 事件【英文标题】:Partial refresh fires the addOnLoad event in XPage 【发布时间】: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 然后可以将值写入隐藏字段并检查。 【参考方案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,它起作用了。万分感谢! :)

以上是关于部分刷新触发 XPage 中的 addOnLoad 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UICollectionView 的补充视图中触发刷新

如何在 XPage 上配置 xe:viewFileItemService 以过滤分类视图中的数据?

Dojo addOnLoad,但 Dojo 是不是已加载?

dojo的ready函数:dojo.ready(以前的dojo.addOnLoad)

刷新控制目标动作未触发

如何从primefaces中的javascript触发组件刷新?