为什么 AfterPageLoad 事件会在未呈现的自定义控件上触发?
Why would an AfterPageLoad event fire on a custom control that is not rendered?
我有一个如下所示的 XPage。在初始加载 XPage 时,自定义控件 ccWFSCat1template 设置为 Rendered = false。但是,在自定义控件的 AfterPageLoad 中,我有这段代码
sessionScope.ssCat1View = compositeData.cat1View;
getCategory(compositeData.cat1View ,"" , compositeData.targetDB);
当 XPage 首次加载时,值 ssShowControl 设置为 false,但 ccWFSCat1Template 的 AfterPageLoad 事件已触发,并且 ssCat1View 具有来自自定义控件的 compositeData.cat1View 的值。我假设如果未呈现控件,则不会处理它的操作,并且它的 none 自定义属性将可用。自定义控件的 AfterPageLoad 中的 SSJS getCategory 也失败,因为它没有处理操作所需的一切。据我了解,如果某些内容已呈现 = false,则该块内的任何内容均未加载或可用。我很困惑。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:debug="http://www.openntf.org/xsp/debugtoolbar"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:this.beforePageLoad><![CDATA[#{javascript:sessionScope.ssShowControl = false}]]></xp:this.beforePageLoad>
<debug:toolbar defaultCollapsed="false" collapseTo="left"></debug:toolbar>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:panel id="panelData">
<xp:table>
<xp:tr>
<xp:td>
<xp:button value="Display" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="panelData">
<xp:this.action><![CDATA[#{javascript:sessionscope.ssShowControl = true;}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xc:ccWFSCat1Template cat1DisplayRows="25"
cat1View="vwDemoSort" dataDisplayRows="10"
dataView="vwDemoData" rendered="#{javascript:(sessionScope.ssShowControl)}">
<xp:this.facets>
<xp:text escape="true" id="computedField1"
xp:key="viewBodyFacet" value="#{javascript:veData}">
</xp:text>
</xp:this.facets>
</xc:ccWFSCat1Template>
</xp:td>
</xp:tr>
</xp:table>
</xp:panel>
</xp:view>
当您查看 JSF Lifecycle(原始文章隐藏在 developerworks 重组后的某处)时,您可以看到 invoke application 是 [= 之前的一个阶段14=]呈现响应。 rendered
属性 仅在 render response 阶段被考虑。因此您的代码运行。不是你所期望的,但按设计工作
我有一个如下所示的 XPage。在初始加载 XPage 时,自定义控件 ccWFSCat1template 设置为 Rendered = false。但是,在自定义控件的 AfterPageLoad 中,我有这段代码
sessionScope.ssCat1View = compositeData.cat1View;
getCategory(compositeData.cat1View ,"" , compositeData.targetDB);
当 XPage 首次加载时,值 ssShowControl 设置为 false,但 ccWFSCat1Template 的 AfterPageLoad 事件已触发,并且 ssCat1View 具有来自自定义控件的 compositeData.cat1View 的值。我假设如果未呈现控件,则不会处理它的操作,并且它的 none 自定义属性将可用。自定义控件的 AfterPageLoad 中的 SSJS getCategory 也失败,因为它没有处理操作所需的一切。据我了解,如果某些内容已呈现 = false,则该块内的任何内容均未加载或可用。我很困惑。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:debug="http://www.openntf.org/xsp/debugtoolbar"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:this.beforePageLoad><![CDATA[#{javascript:sessionScope.ssShowControl = false}]]></xp:this.beforePageLoad>
<debug:toolbar defaultCollapsed="false" collapseTo="left"></debug:toolbar>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:panel id="panelData">
<xp:table>
<xp:tr>
<xp:td>
<xp:button value="Display" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="panelData">
<xp:this.action><![CDATA[#{javascript:sessionscope.ssShowControl = true;}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xc:ccWFSCat1Template cat1DisplayRows="25"
cat1View="vwDemoSort" dataDisplayRows="10"
dataView="vwDemoData" rendered="#{javascript:(sessionScope.ssShowControl)}">
<xp:this.facets>
<xp:text escape="true" id="computedField1"
xp:key="viewBodyFacet" value="#{javascript:veData}">
</xp:text>
</xp:this.facets>
</xc:ccWFSCat1Template>
</xp:td>
</xp:tr>
</xp:table>
</xp:panel>
</xp:view>
当您查看 JSF Lifecycle(原始文章隐藏在 developerworks 重组后的某处)时,您可以看到 invoke application 是 [= 之前的一个阶段14=]呈现响应。 rendered
属性 仅在 render response 阶段被考虑。因此您的代码运行。不是你所期望的,但按设计工作