我们有一个包含一些Accordions的页面。有些手风琴开始为空,当用户通过部分更新点击Accordion栏时,它们会被填满。一开始,这样可以正常工作,但如果用户在稍后阶段打开手风琴,则无法正常工作。
当用户离开手风琴,在同一个nsf中切换到不同页面,在那里做了很多事情,然后回到第一页时,就会发生这种情况。不知何故,不执行与部分刷新相关的代码。
以下是一些代码:
<xe:djAccordionPane id="djAccordionPane3">
<xp:div id="outerPanelModels">
<xc:ccModelView>
<xc:this.rendered><![CDATA[#{javascript:UserData.getVar("ShowModels")}]]></xc:this.rendered>
</xc:ccModelView>
</xp:div>
<xe:this.dojoAttributes>
<xp:dojoAttribute name="Title" value="#{javascript:constants.Models}"></xp:dojoAttribute>
</xe:this.dojoAttributes>
<xp:eventHandler event="onShow" submit="true" refreshMode="partial"
refreshId="outerPanelModels">
<xp:this.onComplete><![CDATA[hideAjaxLoader();]]></xp:this.onComplete>
<xe:this.script><![CDATA[if(document.getElementById("#{id:outerPanelModels}").childElementCount==0) {
showAjaxLoader();
return true
}
return false;]]></xe:this.script>
<xe:this.action><![CDATA[#{javascript:UserData.putVar("ShowModels", true)}]]></xe:this.action>
</xp:eventHandler>
</xe:djAccordionPane>
UserData是一个sessionScope bean。 putVar和getVar曾经在一个viewScope bean中,我怀疑这个bean会以某种方式被破坏(实际上是这样)所以我把代码移到了sessionScope。
为什么底部的代码行没有被执行,即带有UserData.putVar的行(“ShowModels”,true)?有线索吗?解决方案可能??
谢谢!
更新 应用程序设置为将所有页面保留在内存中。
xsp.properties:
xsp.error.page=xError.xsp
xsp.library.depends=com.ibm.xsp.extlib.library
xsp.min.version=8.5.3
xsp.persistence.mode=basic
xsp.resources.aggregate=false
xsp.theme.web=extendOneUI.theme
xsp.openlog.expireDate=15
xsp.error.page=Error.xsp
xsp.persistence.viewstate=fullstate
# org.openntf.domino.xsp=godmode,marcel,bubbleExceptions
xsp.application.forcefullrefresh=true
xsp.error.page.default=true
xsp.session.timeout=180
xsp.application.timeout=180
答案 0 :(得分:1)
查看xsp.properties,特别是要保留在内存中并保留在磁盘上的页数的持久性属性。还有默认设置。
一旦存储了一定数量的组件树,如果您尝试存储另一个组件树,则最早将被转储。在您正在描述的场景中,听起来它正在使用accordion容器转储页面的组件树,这也会转储UserData viewScoped变量。
没有灵丹妙药的答案,这将取决于您的应用程序以及用户如何与之交互。它还取决于你是将所有页面保存在内存中,所有页面都保存在磁盘上还是混合使用中。基本上,如果您允许用户在浏览器中打开同一NSF的其他选项卡,除非您可以保持该页面的组件树可用,否则存在组件树丢失的风险,因为服务器端无法知道它是什么仍然在浏览器中打开。