Xpages 我们如何仅使用客户端脚本来;隐藏/何时;?

Xpages 我们如何仅使用客户端脚本来;隐藏/何时;?,xpages,Xpages,我正在开发一个大型的全球应用程序,其中包括从低带宽区域进行访问。因此,我希望对所有复杂的hide/when计算使用最少的ssj或部分刷新。以下是我到目前为止对一个简单的“隐藏/何时”的理解: 是/否单选按钮,带有CSJ以显示面板(“是”)或隐藏 小组(“否”) 面板内部有一个formTable,其值按照#1显示或隐藏 在XPage的onClientLoad中,运行以下代码: // "getRadioValue" is a simple script to return the value of

我正在开发一个大型的全球应用程序,其中包括从低带宽区域进行访问。因此,我希望对所有复杂的hide/when计算使用最少的ssj或部分刷新。以下是我到目前为止对一个简单的“隐藏/何时”的理解:

  • 是/否单选按钮,带有CSJ以显示面板(“是”)或隐藏 小组(“否”)
  • 面板内部有一个formTable,其值按照#1显示或隐藏
  • 在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事件应该读取文档中保存的值,并决定是否显示面板。在编辑模式下打开文档时,OnClient Load启动,读取radioButton值并成功显示或隐藏面板

    到目前为止,我一直在尝试让它在读取模式下工作:

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

    <div id="radioButtonPanel" style="<ComputedValue>">
    
    <div class="#{javascript:return (currentDocument.getValue('radioButton') == 'Yes' ? 'visible' : 'hidden');}">
    <xp:panel>
    ...
    </xp:panel>
    </div>
    
    
    
    其中,ComputedValue将读取文档的后端值,并决定不添加任何内容或“display:none”

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


    有什么方法可以让这个100%的CSJS成为现实吗?我觉得我已经很接近了,但我想知道在整个过程中我是否遗漏了一些东西。

    首先,我建议计算CSS类,而不是计算样式——只需定义一个名为
    隐藏的
    类,该类应用
    显示:无;
    规则。然后切换可见性变得像调用或一样简单

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

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

    <div id="radioButtonPanel" style="<ComputedValue>">
    
    <div class="#{javascript:return (currentDocument.getValue('radioButton') == 'Yes' ? 'visible' : 'hidden');}">
    <xp:panel>
    ...
    </xp:panel>
    </div>
    
    
    ...
    
    你提到你不能通过……为什么不呢?谢谢!很有魅力!我还有更多的“隐藏/何时”继续,但我可以从这里开始。为了其他人的利益,如果有多个条件,会发生什么?基本上,它们仍然有效,但一些字符需要进行一些小的更改。以下面的示例为例:…使用“&&”将显示错误“实体名称必须紧跟在实体引用中的“&”之后。因此,不要使用“&&&”,而是用“&;”,这样就可以了。这一点很好。您还需要编码(即“someValue-anotherValue”)。使用visual editor时,如果检测到需要转义或编码的字符,它会自动将表达式包装在CDATA中,但手动编辑passthru属性时,我们自己转义或编码这些字符会更快。