SSJS脚本库中的全局变量未按预期工作

时间:2012-04-09 17:33:21

标签: xpages

使用8.5.3 UP1。我遇到了SSJS脚本库的问题,我正在使用“hide / whens”或更确切地说是xpages“show / ifs”。在任何情况下,全局变量似乎都取上次保存脚本库的值。它们似乎不基于文档当前值进行计算。这是一件众所周知的事情(显然我不知道)。这是一个示例页面和脚本库,用于演示此问题:

示例XPage:                                      

<xp:this.resources>
    <xp:script src="/ssjsVisTest.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xp:inputText id="inputText1" value="#{document1.StatusTX}"></xp:inputText>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Save" id="SaveBtn">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete">
        <xp:this.action>
            <xp:saveDocument var="document1"></xp:saveDocument>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label id="label1" value="Status is Draft"
    rendered="#{javascript:statusVisibleDraft()}">
</xp:label>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label id="label2" value="Status is Pending"
    rendered="#{javascript:statusVisiblePending()}">
</xp:label>
<xp:br></xp:br>
<xp:br></xp:br>
</xp:view>

示例SSJS脚本库:

var status = document1.getItemValueString('StatusTX');

function statusVisibleDraft() {

x = (status == "Draft") ? 1 : 0;

if(x > 0) {
    return true;
} else {
    return false;
}
}

function statusVisiblePending() {

x = (status == "Pending") ? 1 : 0;

if(x > 0) {
    return true;
} else {
    return false;
}
}

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:4)

脚本库中的变量本质上是瞬态的。根据系统负载,库可能会在调用之间卸载。全局变量的正确位置是范围(这是它们的用途)。在您的示例中,视图范围似乎是合适的。 Sven也是关于计算的。此外,最好不要有侧面依赖。如果添加另一个具有不同名称的数据源,则无法重用ssjs lib。您可以将数据源作为参数移交,例如在beforeRenderResult中: setstatusDraftVisible(文档1, '状态', '草稿') 在这样的函数中,你检查字段(第二个参数)是否存在并具有第三个参数的值然后设置: viewScope.statusDraftVisible = TRUE; //或假

然后你渲染了=“#{JavaScript:viewscope.statusDraftVisible}”

当您的应用程序更复杂并且您有很多这些检查时,您可能会考虑使用viewScope的“支持bean”aka托管bean。这可以减少渲染到 渲染= “#{beanName.statusDraftVisible}”

哪个更快。

答案 1 :(得分:2)

我认为这是因为每次调用statusVisibleDraft()和statusVisiblePending()函数时都没有设置状态变量,因为它在函数之外。

在每个函数中移动状态变量的赋值:

var statusVisibleDraft = function() {

  var status = document1.getItemValueString('StatusTX');

  x = (status == "Draft") ? 1 : 0;

  if(x > 0) {
      return true;
  } else {
      return false;
  }
}

var statusVisiblePending = function() {

  var status = document1.getItemValueString('StatusTX');

  x = (status == "Pending") ? 1 : 0;

  if(x > 0) {
      return true;
  } else {
      return false;
 }
}

答案 2 :(得分:2)

只有在加载库时才会执行SSJS库中的代码。多米诺骨牌服务器在内部缓存库。只有保存SSJS库或嵌入XPage,才会重新加载和重新执行库。

如果在浏览器中重新加载XPage,则不会重新加载或再次执行SSJS库。即使您关闭浏览器并重新打开XPage,多米诺也不会刷新它们。

只需在SSJS库中添加一些打印语句,就可以在服务器控制台上看到该行为。

也许这就是你要找的答案。

希望这会有所帮助 斯文

修改 这意味着您的全局变量 status 将仅在第一次加载SSJS库时计算。