2013-03-25 57 views
0

我正在开发一个大型的全球应用程序,其中包括低带宽区域的访问。因此,我想对所有复杂隐藏/计算时使用最少的SSJS或部分刷新。以下是我迄今为止一个简单的“隐藏/时”:我们如何才能使用客户端脚本“hide/whens”?

  1. 是/否单选按钮,与CSJS显示面板(“是”)或隐藏 面板(“否”) 。
  2. 面板中有一个formTable,并按照#1显示或隐藏值。
  3. 在XPage上的onClientLoad,下面的代码运行:

    // "getRadioValue" is a simple script to return the value of a radio button 
    var v_value = getRadioValue("#{id:radioButton}"); 
    v_div = '#{javascript:getClientId("radioButtonPanel")}'; 
    // show or hide div simply use dojo to change the display of the panel 
    if (v_value == 'Yes') { 
        showDiv(v_div); 
    } else { 
        hideDiv(v_div); 
    }; 
    

对于一个新文档时,onClientLoad脚本将隐藏 “radioButtonPanel” 成功。将单选按钮更改为“是”将显示radioButtonPanel,就像单击“否”将隐藏它。它很棒! :-)

一旦保存文档并在读取模式下重新打开,虽然onClientLoad CSJS事件应该读取文档中保存的值,并决定是否显示面板。当文档在编辑模式下打开时,onClientLoad会触发,读取radioButton值并成功显示或隐藏面板。

这是我到目前为止已经试过,让它在读模式工作:

  1. 在CSJS,使用“#{的javascript:currentDocument.getItemValueString(‘单选按钮’}”来获得值,
  2. 做一些计算中的“渲染”或“可见”的属性,但是这是SSJS,如果隐藏,防止任何的“显示/ hideDiv” CSJS可见样式的变化。
  3. 添加一个老式“ div“来计算样式(这是我在XPages之前所做的),但由于我无法再通过传递html,我似乎无法获得CSJS计算对风格的评价。理想情况下,我可以做这样的事情:

    <div id="radioButtonPanel" style="<ComputedValue>"> 
    

    凡ComputedValue将读取该文件的后端价值,并决定添加什么或“显示:无”。

请注意,我不想使用viewScopes,因为这个长表格在所有其他hide/when中需要很多。

有没有办法让这个100%的CSJS?我觉得我非常接近,但是我想知道在整个过程中是否有什么我只是缺少的东西。

+0

您提到你不能通过传递...为什么不呢? – 2013-03-25 23:48:51

回答

8

首先,我不推荐计算CSS类,而是定义一个名为hidden的类来应用display:none;规则。然后切换可视性变得像调用dojo.addClassdojo.removeClass一样简单。

其次,我看到您使用#{id:component}语法获取单选按钮的客户端ID,但使用SSJS获取面板的客户端ID。两者都使用id:语法;这仍然只是一个服务器端的优化,但是如果这些计算有很多实例,就会加起来。同样,将#{javascript:currentDocument.getItemValueString('radioButton'}替换为#{currentDocument.radioButton}。两者都会返回相同的值,但后者会更快。

最后,仍然可以计算pass-thru标记的任何属性(任何没有名称空间的组件,如xp:xc:),但您需要手动填充表达式,因为编辑器不知道哪些属性适用于这些标签,因此不提供图形表达式编辑器。因此,如果评估初始显示的理想方式是将内容封装在div中,结果可能如下所示:

<div class="#{javascript:return (currentDocument.getValue('radioButton') == 'Yes' ? 'visible' : 'hidden');}"> 
<xp:panel> 
... 
</xp:panel> 
</div> 
+0

谢谢!奇迹般有效!我还有更多的“隐藏/什么时候去”,但我可以从这里拿走它。 – 2013-03-26 13:30:31

+1

为了其他人的利益,如果有多种条件会发生什么?基本上,他们仍然工作,但有些角色需要一些小的改变。以下列为例:

...
“&&”会给出错误信息“实体名称必须紧跟在实体引用中的'&'后面。 因此,而不是使用“&&”,将它们替换为“& &”,它将起作用。 – 2013-03-27 13:35:28

+1

好点。您还需要编码<>(即“someValue < anotherValue”)。使用可视化编辑器时,如果它检测到需要转义或编码的字符,它会自动将表达式包装在CDATA中,但是当手动编辑passthru属性时,更快地转义或编码这些字符。 – 2013-03-27 17:46:57

相关问题