0

我正在开发一个大型的全球应用程序,其中包括来自低带宽区域的访问。因此,我想对所有复杂的隐藏/时间计算使用最少的 SSJS 或部分刷新。到目前为止,这是一个简单的“隐藏/何时”:

  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”。将单选按钮更改为“是”将显示单选按钮面板,就像单击“否”将隐藏它一样。效果很好!:-)

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

这是我迄今为止尝试过的,让它在读取模式下工作:

  1. 在 CSJS 中,使用 "#{javascript:currentDocument.getItemValueString('radioButton'}" 获取值,
  2. 在“rendered”或“visible”属性中进行一些计算,但这是 SSJS,如果隐藏,会阻止任何“show/hideDiv”CSJS 可见性样式更改。
  3. 添加一个老式的“div”来计算样式(这是我在 XPages 之前所做的),但由于我不能再做 pass-thru html,我似乎无法获得样式的 CSJS 计算. 理想情况下,我可以这样做:

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

    ComputedValue 将读取文档的后端值,并决定不添加任何内容或“显示:无”。

请注意,我不想使用 viewScopes,因为这种长形式需要其中许多用于所有其他隐藏/何时。

有没有办法让这个 100% CSJS?我觉得我很接近,但我想知道我在整个过程中是否缺少一些东西。

4

1 回答 1

8

首先,我建议不要计算样式,而是计算 CSS 类——只需定义一个名为的类hidden来应用display:none;规则。然后切换可见性就像调用dojo.addClassdojo.removeClass一样简单。

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

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

<div class="#{javascript:return (currentDocument.getValue('radioButton') == 'Yes' ? 'visible' : 'hidden');}">
<xp:panel>
...
</xp:panel>
</div>
于 2013-03-26T00:20:27.080 回答