3

使用 8.5.3 UP1。我在用于“隐藏/何时”或更确切地说在 xpages“显示/ifs”中使用的 SSJS 脚本库存在问题。无论如何,全局变量似乎采用了我上次保存脚本库的值。他们似乎没有根据文档的当前值进行计算。这是一个已知的事情(显然我不知道。)。这是一个示例页面和脚本库来演示该问题:

示例 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;
}
}

有任何想法吗?谢谢

4

3 回答 3

4

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

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

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

哪个更快。

于 2012-04-10T01:13:55.810 回答
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;
 }
}
于 2012-04-09T20:13:25.750 回答
2

SSJS 库中的代码只有在加载库时才会执行。domino 服务器在内部缓存该库。仅当您保存 SSJS 库或嵌入 XPage 时,该库才会重新加载并再次执行。

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

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

也许这就是您正在寻找的答案。

希望这有助于斯文

编辑: 这意味着您的全局变量状态将仅在第一次加载 SSJS 库时计算。

于 2012-04-09T20:18:00.960 回答