我在面板中有一个视图(控件),默认值为render =“true”;和一个带getComponent的按钮(viewPanel1).setRendered(false);这是SSJS代码。
这就是发生的事情。当我点击一个按钮时,我仍然会看到这个我不想要的视图。经过一些测试结果如下:
控制台输出测试,我打印(getComponent(“viewPanel1”)。isRendered +“TEST”);显示在JSF的所有生命周期中呈现的属性都设置为false。 当我在浏览器中检查时,还有响应标题中的视图的html代码。
在我看来,默认值会以某种方式覆盖或绕过按钮设置的值。如果是这样,为什么以及如何解决这个问题。
答案 0 :(得分:3)
不是直接与组件通信,而是将视图面板的rendered
属性绑定到数据属性并更新该属性。
例如,在您的XPage源代码中:
<xp:viewPanel rendered="#{not(viewScope.hideRelatedDocuments)}">
然后,在你的按钮中:
viewScope.put("hideRelatedDocuments", true);
当页面更新时,将跳过组件,因为它将重新计算rendered
的值绑定,现在将评估为false
(因为表达式正在翻转存储在作用域中的布尔值)。
您可以将其应用于数据源或托管bean的属性,而不是将其存储在范围变量中...您只需要相应地调整按钮代码的语法以考虑API的存储值的对象; e.g:
userSettings.setValue("hideRelatedDocuments", true); // document data source
// or...
settingsBean.setHideRelatedDocuments(true); // managed bean
在任何这些场景中,相同的原则都适用:将视觉特性绑定到数据模型,并更新事件代码以修改该数据模型,从而简化实现所需的行为。
至少有两个原因可以解释为什么这种方法更可取:
<强> 1。性能强>
getComponent()
计算成本很高。这在简单页面上或在最小用户负载下(例如,在单元测试期间)不明显,但随着应用程序在复杂性,采用或两者中的增长,调用getComponent()
会对响应时间产生负面影响。无论页面复杂性或用户负载如何,读取或写入范围变量,数据源或托管bean的属性,始终 *的执行速度都快于getComponent()
。因此,即使您确定此页面永远不会变得复杂或需要支持1000个并发用户,现在切换到更好的模式会建立一种习惯,当性能成为关键考虑时,这种习惯会得到回报。 / p>
<强> 2。可维护性强>
据推测,有一些业务流程内涵与用户关于他们是否希望在页面上显示该特定视图面板的决定相关联。将此决策作为数据模型的命名属性,允许受业务流程的这个方面影响的所有组件,事件和数据都知道集中存储的值,而不是必须在同一个按钮中通知所有这些:只需更新一个属性,然后需要知道的所有内容都可以引用它,而不必反过来询问组件是否呈现...取决于组件的位置,实际上,其他组件可能不均匀能够找到它。相反,您确定将存储此属性的数据的范围,因此您可以确保需要知道其值的所有内容都可以找到它,并有效地找到它(请参阅上一点)。
如上所述,这个考虑因素可能不是您此次尝试解决的一个特定用例中的一个因素,但如果您(或其他人阅读此答案)发现自己处于一个因素,你已经在使用一种简单的模式了。
* ...除非您的bean或数据源具有自定义副作用,例如存储您在Domino之外修改的属性的值等。但是,解决其中一个内存中对象的基本计算负担是始终低于分层遍历组件树以找到您关心的一个组件...这正是getComponent()
所做的。
答案 1 :(得分:1)
我删除了id碰撞后解决了这个问题。我将显示组件的渲染属性绑定到viewScope变量。 ViewScope变量使用按钮设置。
这是jss代码:
function calcRendered(caller, renderMe)
{
if (caller == renderMe) return true;
else false;
}
在每个显示组件上调用以进行渲染
<xp:this.rendered>
<![CDATA[#{javascript:
calcRendered(this.id, viewScope.RenderMe);}
]]>
</xp:this.rendered>
更改渲染属性的按钮代码。
<xp:this.action>
<![CDATA[#{javascript:
viewScope.RenderMe = "viewPanel3";}
]]>
</xp:this.action>
我相信这可以做得更好。显示组件应仅在调用时计算渲染属性。 IE:按钮告诉组件容器渲染组件而不是自己(组件)每次为自己计算渲染属性。