如果一个页面分配了很多标签,加载对话框可能需要相当长的时间(最多20秒)。如果作者只想在多个页面上更改一些其他属性,这可能会变得相当烦人。问题是,是否有一种方法可以在对话框中延迟加载标签?
更准确地说,我说的是基于ExtJS的"经典UI"。
实际上有两种方法可以实现这一点,都是使用按钮来触发加载:
打开子对话框:
<button
jcr:primaryType="cq:Widget"
text="Open Tags Dialog"
handler="function(button) {
var parent = button.findParentByType('dialog');
var dialog = CQ.WCM.getDialog(PATH_TO_DIALOG + '.infinity.json');
dialog.setFormUrl(parent.form.url);
dialog.loadContent(parent.form.url);
dialog.show();
}"
xtype="button"/>
解释:处理程序在点击时被触发。它将加载子对话框,将提交url和数据源设置为与当前对话框相同的节点。
覆盖标签(按钮位于自己的标签中):
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="cq:Panel"
title="Tags"
extensionGet=".json"
xtype="customcontentpanel">
<items jcr:primaryType="cq:WidgetCollection">
<button
jcr:primaryType="cq:Widget"
text="Load Tags"
handler="function(button) {
var parent = button.findParentByType('panel');
var tabConf = CQ.shared.HTTP.eval(PATH_TO_TAB + '.infinity.json');
var tab = CQ.Util.formatData(tabConf);
for (var i=0; i<tab.items.length; i++) {
parent.add(tab.items[i]);
}
parent.doLayout();
parent.loadContent();
parent.remove(button);
}"
xtype="button"/>
</items>
</jcr:root>
说明:cq:Panel
需要使用xtype="customcontentpanel"
和extensionGet=".json"
。默认情况下,其他属性是从包含此面板的对话框继承的。CQ.shared.HTTP.eval
加载JSON并将其转换为JavaScript对象。然后CQ.Util.formatData
将XML属性(如jcr:primaryType
)转换为xtype
。然后迭代刚刚加载的选项卡配置中的所有元素,并将它们添加到当前选项卡中。由于这些小部件是在初始加载对话框之后添加的,因此需要再次调用doLayout()
和loadContent()
。最后一步是删除按钮