部分刷新触发 XPage 中的 addOnLoad 事件
Posted
技术标签:
【中文标题】部分刷新触发 XPage 中的 addOnLoad 事件【英文标题】:Partial refresh fires the addOnLoad event in XPage 【发布时间】:2013-08-02 06:08:05 【问题描述】:在我的 XPage 中,我的脚本块中有一个 addOnLoad
。但问题是即使在我不想要的部分刷新期间它也会触发。例如如果我在数据表上有一个寻呼机控件,那么单击页面会触发 addOnLoad
函数。 dojo.addOnLoad
和 XSP.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 以过滤分类视图中的数据?