使用 8.5.3 UP1。我在使用 SSJS 脚本库时遇到问题,该脚本库用于“hide/when”或更准确地说是在 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;
}
}
有什么想法吗?谢谢
最佳答案
脚本库中的变量本质上是 transient 的。根据系统负载,库可能会在调用之间卸载。全局变量的正确位置是作用域(这就是它们的用途)。在您的示例中, View 范围似乎是合适的。斯文关于计算的看法也是正确的。此外,最好不要有侧面依赖。如果您添加另一个具有不同名称的数据源,您将无法重用您的 ssjs 库。您可以将数据源作为参数移交,例如在渲染结果之前: setstatusDraftVisible(document1,'状态','草稿') 在这样的函数中,您检查字段(第二个参数)是否存在并且具有第三个参数的值,然后设置: viewScope.statusDraftVisible=true;//或错误
然后你已经渲染了=“#{JavaScript:viewscope.statusDraftVisible}”
当您的应用程序更加复杂并且需要进行大量此类检查时,您可能会考虑使用 viewScope“支持 bean”(也称为托管 bean)。这可能会减少渲染到 渲染=“#{beanName.statusDraftVisible}”
哪个更快。
关于xpages - SSJS 脚本库中的全局变量未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10077178/