Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XPages:在部分刷新的自定义控件中丢失变量_Java_Xpages_Javabeans - Fatal编程技术网

Java XPages:在部分刷新的自定义控件中丢失变量

Java XPages:在部分刷新的自定义控件中丢失变量,java,xpages,javabeans,Java,Xpages,Javabeans,我可以再次得到一些帮助 我们在XPages中构建了自己的表单。表单由用户在Notes中定义,并通过XPages/web使用。我们添加了几个托管bean,以更好地控制页面使用的数据和页面上的控件。整个过程是嵌套的,表单控件可以在一个页面上使用多次,也可以使用重复控件,现在我需要部分刷新面板 部分代码: <xp:panel id="ccAnyForm"> <xp:this.dataContexts> <xp:dataContext var="fo

我可以再次得到一些帮助

我们在XPages中构建了自己的表单。表单由用户在Notes中定义,并通过XPages/web使用。我们添加了几个托管bean,以更好地控制页面使用的数据和页面上的控件。整个过程是嵌套的,表单控件可以在一个页面上使用多次,也可以使用重复控件,现在我需要部分刷新面板

部分代码:

<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上存在多次。