在Xpage上动态添加自定义控件

时间:2012-05-30 07:45:43

标签: xpages

如何在sessionScope变量的基础上添加自定义控件。我尝试包含页面容器控件,但没有运气:

<xp:this.afterPageLoad><![CDATA[#{javascript:sessionScope.put("viewName","ccViewAll.xsp");}]]></xp:this.afterPageLoad>
<xp:text escape="true" id="computedField1">
    <xp:this.value><![CDATA[#{javascript:sessionScope.get("viewName")}]]></xp:this.value>
</xp:text>
<xc:appLayout>
    <xp:this.facets>
        <xp:panel xp:key="facetMiddle">
            <xp:include id="include1">
                <xp:this.pageName><![CDATA[${javascript:sessionScope.get("viewName")}]]>
                </xp:this.pageName>
            </xp:include>
        </xp:panel>
    </xp:this.facets>
</xc:appLayout>

上面的代码给我错误错误404 HTTP Web服务器:找不到项目异常。但是当我硬编码ccViewAll.xsp而不是sessionScope.get(“viewName”)的视图名时,它的工作正常。

-MAK

3 个答案:

答案 0 :(得分:4)

如果您有ExtLib for XPage,则可以使用动态内容控件或switchFacet控件。 Teamroom模板(ExtLib附带的演示应用程序)在“allDocuments”Xpage或“allDocsAllTab”自定义控件中使用这些,这些都是很好的例子。

如果你没有ExtLib,你可以使用自定义控件的加载/呈现属性来决定加载哪一个。

e.g。

<xp:panel key="MiddleColumn">
   <xc:customControl1 loaded="${javascript: if(viewScope.control == "customControl1")}"></xc:customControl1>
   <xc:customControl2 loaded="${javascript: if(viewScope.control == "customControl2")}"></xc:customControl2>
</xp:panel>

loaded = false表示不会对此控件执行任何操作。 rendered = false意味着控件将被创建但隐藏,您可以稍后更改它以显示它。

使用渲染,如果它会发生变化,例如当一个按钮被点击并加载时,它在启动时决定,并且在用户登录时不会改变。

答案 1 :(得分:3)

如果你使用它在domino数据库中根据我建议查看扩展库的动态视图面板控件的其他选择显示不同的视图。

使用此控件意味着您不需要为要使用的每个视图创建不同的自定义控件,只需使用具有此控件的单个页面,并将其指向正确的视图以通过范围变量显示。

如果需要自定义每个视图的显示方式,可以创建一个viewControl bean,根据它显示的视图设置其他属性。

答案 2 :(得分:0)

值得一提的是,如果您不使用ExtLib - 如果您正在使用部分刷新,那么您必须使用呈现的属性,因为只能在pageLoad上计算加载的属性。

根据我的理解,这意味着每个自定义控件都将由服务器计算,这可能不是您想要的。 (一方面增加了开销。)

/ J