自定义控件中的数据源与 XPage 和 BeforeRenderResponse 事件中的数据源

Data Source in Custom Controls vs. in XPages and BeforeRenderResponse Event

我有一些奇怪的行为,让我们看看下面的例子:

第一个没有问题的例子:

XPage(包含数据源)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">

    <xp:this.data>
        <xp:dominoDocument var="docData" 
            formName="frmPrototype" 
            action="openDocument"
            documentId="3DEF64BFAD6E1F32C12580B8003CB18F">
        </xp:dominoDocument>
    </xp:this.data>

    <xc:ccModule></xc:ccModule>

</xp:view>

自定义控件"ccModule"

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">

    <xc:ccSubModule></xc:ccSubModule>

</xp:view>

自定义控件"ccSubModule"

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.beforePageLoad><![CDATA[#{javascript:print("beforePageLoad");
print(docData.getDocument().getUniversalID());
print(docData.getItemValueString("Subject"));}]]></xp:this.beforePageLoad>

    <xp:this.beforeRenderResponse><![CDATA[#{javascript:print("beforeRenderResponse");
print(docData.getDocument().getUniversalID());
print(docData.getItemValueString("Subject"));}]]></xp:this.beforeRenderResponse>

</xp:view>

预期输出:

现在第二个例子略有不同:

在此示例中,数据源已移至 ccModule 自定义控件。

XPage

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">

    <xc:ccModule></xc:ccModule>

</xp:view>

自定义控件"ccModule"(包含数据源)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">

    <xp:this.data>
        <xp:dominoDocument var="docData" 
            formName="frmPrototype" 
            action="openDocument"
            documentId="3DEF64BFAD6E1F32C12580B8003CB18F">
        </xp:dominoDocument>
    </xp:this.data>

    <xc:ccSubModule></xc:ccSubModule>

</xp:view>

自定义控件"ccSubModule"

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.beforePageLoad><![CDATA[#{javascript:print("beforePageLoad");
print(docData.getDocument().getUniversalID());
print(docData.getItemValueString("Subject"));}]]></xp:this.beforePageLoad>

    <xp:this.beforeRenderResponse><![CDATA[#{javascript:print("beforeRenderResponse");
print(docData.getDocument().getUniversalID());
print(docData.getItemValueString("Subject"));}]]></xp:this.beforeRenderResponse>

</xp:view>

输出:

看来,现在beforerenderrepsone事件中的数据源不再可用了?

知道这里发生了什么吗?

这里有几个潜在的方面在起作用。我之前确定了一些关于数据源计算设置的内容,并在 "Marty, You're Just Not Thinking Fourth Dimensionally" TLCC 网络研讨会的 Connect、Engage 和交付会议中进行了介绍(查看 2016 年的最后一个 here)。如果数据源附加到 XPage,它会在 ViewHandler 的 createView 方法期间加载,该方法在 beforePageLoad 之前运行。如果它附加到 XPage 上的组件(面板、自定义控件等),它会在 beforePageLoad 期间计算该组件的属性时计算。请参阅幻灯片上的幻灯片 10。

另一个值得牢记的因素是您设置 documentId 属性,而不是设置 ignoreRequestParams。因此,可能发生的情况(同样,该网络研讨会值得一看)是,在 beforePageLoad 中,您获得了指定的文档,但在 beforeRenderResponse 中,数据源被告知查看请求参数为空,因此正在创建 new 文档。显然你无法获取新文档的后端文档 - 因为它尚未保存,所以不存在。