使用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;
}
}
有什么想法吗?感谢
答案 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库时计算。