自定义控件中的数据源与 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 文档。显然你无法获取新文档的后端文档 - 因为它尚未保存,所以不存在。
我有一些奇怪的行为,让我们看看下面的例子:
第一个没有问题的例子:
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 文档。显然你无法获取新文档的后端文档 - 因为它尚未保存,所以不存在。