如何将自定义属性嵌入到ext的TitleBar中。应用布局

时间:2013-12-26 16:23:37

标签: xpages xpages-extlib

我创建了一个自定义控件“ccMyLayout”,将扩展库ApplicationLayout添加到其中。在自定义控件上,我创建了一个类型为tree.complex.PageTreeNode的属性定义,称为titleBarTabs允许它的多个实例。然后我创建了一个名为“xpDemoLayout”的XPage,并在其中放置了“ccMyLayout”。在titleBarTabs属性中,我创建了几个pageTreeNodes,我现在想要在ext的Title Bar区域中显示。库。 applicationLayout。我确信有一种方法可以实现这一目标,但我不确定执行此操作的代码将在哪里以及它可能是什么样子。 提前谢谢。

1 个答案:

答案 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”作为树节点的类型。类型只有两个属性:loadednodeBean;您需要同时设置它们。

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 ......天空是极限。

为方便起见,您可以在行动here中看到上述概念,也可以看到download显着的XML和Java示例文件。