Java XPages:在部分刷新的自定义控件中丢失变量
我可以再次得到一些帮助 我们在XPages中构建了自己的表单。表单由用户在Notes中定义,并通过XPages/web使用。我们添加了几个托管bean,以更好地控制页面使用的数据和页面上的控件。整个过程是嵌套的,表单控件可以在一个页面上使用多次,也可以使用重复控件,现在我需要部分刷新面板 部分代码:Java XPages:在部分刷新的自定义控件中丢失变量,java,xpages,javabeans,Java,Xpages,Javabeans,我可以再次得到一些帮助 我们在XPages中构建了自己的表单。表单由用户在Notes中定义,并通过XPages/web使用。我们添加了几个托管bean,以更好地控制页面使用的数据和页面上的控件。整个过程是嵌套的,表单控件可以在一个页面上使用多次,也可以使用重复控件,现在我需要部分刷新面板 部分代码: <xp:panel id="ccAnyForm"> <xp:this.dataContexts> <xp:dataContext var="fo
<xp:panel id="ccAnyForm">
<xp:this.dataContexts>
<xp:dataContext var="formulaire">
<xp:this.value><![CDATA[#{javascript:compositeData.formName || compositeData.dataSource.getItemValueString("Formulaire")}]]></xp:this.value>
</xp:dataContext>
<xp:dataContext var="formdata">
<xp:this.value><![CDATA[#{javascript:PageData.getForm(formulaire, compositeData.dataSource)}]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
<xp:panel id="aFormulaire${javascript:compositeData.name}">
<xe:switchFacet id="switchFacet1">
<xe:this.selectedFacet><![CDATA[#{javascript:formdata.isTabbed()? "tabbed": "flat"}]]></xe:this.selectedFacet>
PageData是一个Javabean,我在执行部分刷新时会丢失formdata。如果我在EventHandler中设置了部分执行模式(数据验证被禁用),我会在代码段的最后一行得到一个错误,上面写着formdata not found。如果我清除部分执行模式,我什么也得不到:没有错误,没有Java错误,没有SSJS错误,什么都没有
这一定是因为我对对象和变量的生命周期缺乏了解,因为我通常不得不使用ValueBindings,但我不知道如何使用
帮助…我看到DataContext重新计算为null,特别是当依赖于其他DataContext时。我认为在应用请求值阶段。当我有了这一点,我改变了代码,只计算在渲染响应阶段 但是,我认为这对您不起作用,因为开关控件在渲染响应之前需要该值,并且没有简单的方法来掌握哪个阶段正在运行
我会采取的方法是在bean中有一个属性(例如,
showtabed
),它保存要显示的开关方面。调用bean方法在页面加载时设置该属性。然后在部分刷新中,再次调用该方法,检查Formulaire字段是否已更改,以确定是否再次调用setShowTabbed(boolean)
。这将最大限度地减少调用次数,并应防止出现问题。只是一点(与答案无关)建议:最好不要使用动态绑定的数据上下文,因为它们经常被重新计算,即使在使用部分执行模式时也是如此。要了解更多信息,请查看Sven Hasselbach的这篇文章:看到了,谢谢。我暂时不太关心重新计算,因为我在代码中缓存第一次调用的结果,并在每次后续调用中返回相同的值。让我更难理解的是,每次部分刷新内容都会更改。您在哪里缓存第一次调用的结果?dataContext是一个动态绑定,因此在每次部分刷新期间都会重新计算。部分刷新本身包含许多阶段,因此属性(如组件的getValue())可能在不同阶段发生更改。谢谢。我尝试在没有DataContext的情况下使用“局部”变量,但有时我会从同一自定义控件的其他版本获取数据。因此,我认为应该使用某种类型的ValueBinding:在加载期间设置绑定,并在其他阶段重用它。不过,可能有另一种方式。如果我能找到某种方法为当前自定义控件定义唯一id,我会将所有内容存储在viewScope变量(或bean)中。我找不到这样的id(我想我测试了这个.getId()在部分刷新后返回的内容,但我不确定…)。@KnutHerrmann发布了一个设置和使用自定义控件id的简单方法,作为以下stackoverflow问题的答案:在同一个XPage上是否多次使用同一个自定义控件?或者bean的作用域是否比viewScope更高?如果您在该XPage上只有一次自定义控件,并且bean仅受viewscope限制,那么您不应该从自定义控件上的其他化身获取数据。面板中的DataContext在调用应用程序期间得到清理,这就是为什么在部分刷新期间变量为null的原因。如果您在页面上多次需要相同的Java对象,请尝试使用dataObject而不是bean。dataObject将允许您创建类的实例,并将其作用于特定面板,而不是viewScope。这将允许您在类上使用属性,即使自定义控件在XPage上存在多次。