【问题标题】:Dynamically add custom control on Xpage在 Xpage 上动态添加自定义控件
【发布时间】:2012-05-30 07:45:42
【问题描述】:

如何在 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>

上面的代码给了我错误 Error 404 HTTP Web Server: Item Not Found Exception。但是当我硬编码 ccViewAll.xsp 而不是 sessionScope.get("viewName") 的视图名称时,它工作正常。

-MAK

【问题讨论】:

    标签: xpages


    【解决方案1】:

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

    如果您没有 ExtLib,您可以使用自定义控件的加载/渲染属性来决定加载哪个。

    例如

    <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 表示不会对此控件执行任何操作。 render = false 表示该控件将被创建但隐藏,您可以稍后更改它以显示它。

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

    【讨论】:

    • 如何调试我的 viewScope 变量?当我输入计算字段时,它显示了该变量的值,但是当我在渲染中比较它时,它总是返回 false !!! [代码] [/code]。我 sluse if(viewScope.get("viewName") == "ccViewAll.xsp")
    • 在服务器端脚本中使用 "print("viewScope: " + viewScope.control);"这将在服务器控制台打印一行,与 java 中的 system.out.println 相同,添加尽可能多的这些以查找问题。仅供参考,您可以使用浏览器控制台和 "console.log("Test: " + test);" 执行相同的客户端操作
    • 关于 javascript 需要注意的一点是 #{javascript: } 和 ${javascript: } 之间的区别。 # 表示每次刷新控件/页面时都会运行,$ 表示只会在页面加载时执行。如果您在页面顶部创建该视图范围,则您呈现的属性可能在创建之前运行。将渲染更改为 #{javascript: }
    • @AshfaqKhatri 有一个不错的 OpenNTF 项目,名为 dBar。 Xpages 调试器。使调试作用域变量更容易。 openntf.org/projects/pmt.nsf/29b713283ca92bf5862570ef00653b4e/…
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,这就是我要找的。谢谢德克兰林奇
    【解决方案3】:

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

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

    /J

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多