Javascript 为什么visible(render)属性的默认值超过了我在Xpages中设置的值

Javascript 为什么visible(render)属性的默认值超过了我在Xpages中设置的值,javascript,xpages,default-value,lifecycle,Javascript,Xpages,Default Value,Lifecycle,我在面板中有一个视图(控件),默认值为rendered=“true”;和一个带有getComponent(viewPanel1)的按钮。setRendered(false);这是SSJS代码 事情就是这样。当我点击一个按钮时,我仍然看到这个视图,这是我不想要的。经过一些测试,结果如下: 控制台输出测试,其中我打印(getComponent(“viewPanel1”).isRendered+测试);显示在JSF的所有生命周期中呈现的属性都设置为false。 当我在浏览器中检查时,响应头中的视图也有

我在面板中有一个视图(控件),默认值为rendered=“true”;和一个带有getComponent(viewPanel1)的按钮。setRendered(false);这是SSJS代码

事情就是这样。当我点击一个按钮时,我仍然看到这个视图,这是我不想要的。经过一些测试,结果如下:

控制台输出测试,其中我打印(getComponent(“viewPanel1”).isRendered+测试);显示在JSF的所有生命周期中呈现的属性都设置为false。 当我在浏览器中检查时,响应头中的视图也有html代码


在我看来,默认值以某种方式覆盖或绕过按钮设置的值。如果是,为什么以及如何修复此问题。

与其直接与组件对话,不如将视图面板的
rendered
属性绑定到数据属性并更新该属性

<xp:this.action>
    <![CDATA[#{javascript:
        viewScope.RenderMe = "viewPanel3";}
    ]]>
</xp:this.action>
例如,在XPage源中:

<xp:viewPanel rendered="#{not(viewScope.hideRelatedDocuments)}">
当页面更新时,组件将被跳过,因为它将重新计算
呈现的
的值绑定,该值现在将计算为
false
(因为表达式正在翻转存储在范围中的布尔值)

您也可以将其应用于数据源或托管bean的属性,而不是将其存储在范围变量中。。。您只需要相应地调整按钮代码的语法,以考虑存储值的对象的API;e、 g:

userSettings.setValue("hideRelatedDocuments", true); // document data source
// or...
settingsBean.setHideRelatedDocuments(true); // managed bean
在所有这些场景中,都适用相同的原则:将可视特征绑定到数据模型,并更新事件代码以修改该数据模型,从而简化了所需行为的实现

这种方法更可取(至少)有两个原因:

1。性能

getComponent()
在计算上很昂贵。这在简单的页面上或在最小的用户负载下(例如,在单元测试期间)是不明显的,但随着应用程序的复杂性、采用率或两者的增加,调用
getComponent()
会对响应时间产生负面影响。读取或写入作用域变量、数据源或托管bean的属性时,无论页面复杂度或用户负载如何,执行速度始终*快于
getComponent()
。因此,即使您确信此页面永远不会变得复杂或需要支持1000个并发用户,现在切换到更好的模式也会建立一种习惯,当性能是一个关键考虑因素时,这种习惯会得到回报

2。可维护性

大概,用户决定是否要在页面上显示此特定视图面板时,会有一些业务流程内涵。将此决策作为数据模型的命名属性,可以让受业务流程的该方面影响的所有组件、事件和数据都知道一个集中存储的值,而不必在同一个按钮中通知所有组件、事件和数据:只需更新一个属性,然后需要知道的所有内容都可以引用它,而无需依次,必须去问一个组件是否被渲染。。。事实上,根据组件的位置,其他组件甚至可能无法找到它。相反,您可以确定将存储此属性的数据的范围,以便确保需要了解其值的所有内容都可以找到它,并高效地找到它(请参见上一点)

如上所述,这一考虑可能不是您这次试图解决的一个特定用例中的一个因素,但是如果您(或其他阅读此答案的人)发现自己处于一个因素的情况下,您已经在使用一种模式,使之变得容易



*…除非您的bean或数据源具有自定义的副作用,例如在Domino之外存储您正在修改的属性的值等。但是,寻址这些内存中对象之一的基本计算负担始终低于分层遍历组件树以查找您关心的组件。。。这正是
getComponent()
所做的。

与其直接与组件对话,不如将视图面板的
rendered
属性绑定到数据属性并更新该属性

<xp:this.action>
    <![CDATA[#{javascript:
        viewScope.RenderMe = "viewPanel3";}
    ]]>
</xp:this.action>
例如,在XPage源中:

<xp:viewPanel rendered="#{not(viewScope.hideRelatedDocuments)}">
当页面更新时,组件将被跳过,因为它将重新计算
呈现的
的值绑定,该值现在将计算为
false
(因为表达式正在翻转存储在范围中的布尔值)

您也可以将其应用于数据源或托管bean的属性,而不是将其存储在范围变量中。。。您只需要相应地调整按钮代码的语法,以考虑存储值的对象的API;e、 g:

userSettings.setValue("hideRelatedDocuments", true); // document data source
// or...
settingsBean.setHideRelatedDocuments(true); // managed bean
在所有这些场景中,都适用相同的原则:将可视特征绑定到数据模型,并更新事件代码以修改该数据模型,从而简化了所需行为的实现

这种方法更可取(至少)有两个原因:

1。性能

getComponent()
在计算上很昂贵。这在简单的页面上或在最小的用户负载下(例如,在单元测试期间)是不明显的,但随着应用程序的复杂性、采用率或两者的增加,调用
getComponent()
会对响应时间产生负面影响。读取或写入作用域变量、数据源或托管bean的属性时,无论页面复杂度或用户负载如何,执行速度始终*快于
getComponent()
。因此,即使您确信此页面永远不会变得复杂或需要支持1000个并发用户,现在切换到更好的模式也会建立一种习惯,当性能是一个关键考虑因素时,这种习惯会得到回报

2。可维护性

据推测,有一些业务流程内涵与用户的决策相关