我创建了一个自定义控件“ccMyLayout”,将扩展库ApplicationLayout添加到其中。在自定义控件上,我创建了一个类型为tree.complex.PageTreeNode的属性定义,称为titleBarTabs允许它的多个实例。然后我创建了一个名为“xpDemoLayout”的XPage,并在其中放置了“ccMyLayout”。在titleBarTabs属性中,我创建了几个pageTreeNodes,我现在想要在ext的Title Bar区域中显示。库。 applicationLayout。我确信有一种方法可以实现这一目标,但我不确定执行此操作的代码将在哪里以及它可能是什么样子。 提前谢谢。
答案 0 :(得分:4)
实现此行为的最理想方法是使用“Managed Bean Node”。这个术语有点误导,因为您不一定要将Java类注册为托管bean。
首先,定义一个扩展com.ibm.xsp.extlib.tree.impl.BasicNodeList
的Java类。例如:
package com.timtripcony.xsp.demo;
import com.ibm.xsp.extlib.tree.impl.BasicLeafTreeNode;
import com.ibm.xsp.extlib.tree.impl.BasicNodeList;
public class DynamicFooterNodeList extends BasicNodeList {
private static final long serialVersionUID = 1L;
public DynamicFooterNodeList() {
// replace the following with your own hardcoded or dynamic nodes
String[] labels = new String[] { "LICENSE", "timtripcony.com" };
String[] hrefs = new String[] { "http://www.apache.org/licenses/LICENSE-2.0.html", "http://timtripcony.com/" };
for (int i = 0; i < labels.length; i++) {
String label = labels[i];
String href = hrefs[i];
BasicLeafTreeNode node = new BasicLeafTreeNode();
node.setLabel(label);
node.setHref(href);
addChild(node);
}
}
}
接下来,在自定义控件上定义一个只接受字符串的自定义属性;它不需要指定它接受多个值,因为BasicNodeList
本身就能够包含一个或多个子节点。
无论您通常只是显式定义树节点(例如,布局控件的footerLinks
属性,只需添加一个树节点,但选择“Managed Bean Node”作为树节点的类型。类型只有两个属性:loaded
和nodeBean
;您需要同时设置它们。
nodeBean
的值应为#{compositeData.footerLinks}
,其中footerLinks
是您之前定义的自定义属性的名称。
loaded
的值应为${not(empty(compositeData.footerLinks))}
(与之前相同)。如果属性未通过其容器传递给自定义控件,则可确保页面不会500,从而使该属性可选。
最后,更新每个容器(即XPage)以指定用于该上下文的类的名称,例如:
<xc:layoutWithConfigurableTreeNodes
footerLinks="com.timtripcony.xsp.demo.DynamicFooterNodeList" />
这是可以成为托管bean的地方,但不需要。如果已定义指向该类实例的托管bean,则可以将其命名为托管bean的名称,而不是将规范类名称指定为属性值。例如,如果计算要包含哪些节点在计算上是昂贵的,您可能希望在应用程序范围中将该类注册为托管bean,因此节点列表将仅计算一次;类似地,如果节点列表将特定于每个用户,则在会话范围中将其注册为bean可确保它对每个用户都是唯一的,但每个会话只计算一次。
上面的示例类仅说明了BasicLeafTreeNode
实例的包含,但您可以以这种方式添加任何类型的树节点。这是另一个例子:
public class DynamicUtilityNodeList extends BasicNodeList {
private static final long serialVersionUID = 1L;
public DynamicUtilityNodeList() {
addChild(new UserTreeNode());
addChild(new LoginTreeNode());
}
}
您提到您正在定义页面树节点,因此最终可能会得到类似于以下内容的代码:
PageTreeNode node = new PageTreeNode();
node.setLabel("Some Page");
node.setPage("/somePage.xsp");
addChild(node);
...您甚至可以用这种方式定义整个节点层次结构。来自Jesse Gallagher的This article演示了如何使用相同的核心技术构建映射到Outline元素设计的树节点层次结构。您也可以将它建立在NSF数据,JDBC,REST,SOAP ......天空是极限。