我在XPage中有一个奇怪的行为,注释了代码。
我有一个带有大量代码的文本字段,输出html,我遇到了这个问题。 虽然开发我在其他领域的某些领域遇到了很多麻烦所以我决定 - 更好地了解该领域正在做什么 - 将故障区域的代码复制到我的文本区域内的注释,以便在我看来有其他代码。但后来xPage开始表现得很奇怪,直到我找到了问题。
下面的代码是导致我的问题的一个例子,它有两个文本字段,其中一个设置范围var,还有一个注释,它设置相同的var但注释,另一个显示ScopeVar。我以为这会输出'我在哪里'在文本框中,但我得到'Huhu我在这里'。
<xp:text escape="true" id="computedField7">
<xp:this.value><![CDATA[#{javascript://
sessionScope.put("findme","where i am");
/* #{javascript:sessionScope.put("findme","HuHu i am here!");} */
return sessionScope.findme;}]]></xp:this.value>
</xp:text>
<xp:br></xp:br>
<xp:text escape="true" id="computedField6"
value="#{javascript:return sessionScope.findme;}">
</xp:text>
在我的原始代码中我遇到了这个问题我想评论旧的#{} el以使用javascript而不是在代码中间保留el评论..同样的resault。如果你在评论中使用#{或$ {它会随时计算!
在笔记9中得到了这个fiexed。我目前正在使用8.5.3。
更新
作为一个小注释:在使用dojoAttribute queryExpr时要小心,因为查询看起来像SSJS "${0}"
,并且也被解释为SSJS。我现在用这个:
<xe:this.queryExpr><![CDATA[${javascript:"*$\{0}*";}]]></xe:this.queryExpr>
让它发挥作用。感谢Paul Stephen Withers提示\{
。
答案 0 :(得分:1)
这是一个有趣的错误。
它是由JavaScript解释器的预处理器功能引起的。通常,您可以在CSJS代码中编写#{javascript:...}
来替换部分代码,然后再将放入渲染页面。
在你的情况下是SSJS。同样,解释器替换了SSJS代码中的#{javascript:...}
,并认为工作已经完成。这样您就可以看到渲染页面上的代码,而不是执行代码的结果。
作为一种解决方法,只需从#
删除/* #{javascript...
,它就会按预期工作。
答案 1 :(得分:1)
在您的示例中,是否有#{javascript:...}嵌套在#{javascript:...}内的原因。我强烈建议不要这样做,我不希望它能给出好的结果。
请参阅stopping getClientId() computations in JS code的答案。我认为你期望它以一种不设计的方式工作,不太可能改变工作。
属性只是在运行时从左到右读取的字符串。如果找到“#{javascript:”,“$ {javascript:”或“#{..”,则会运行生成的代码。在它们周围环绕“//”或“/ ”和“ /”任何一方都没有效果,我也不期望它。整个字符串不会传递给解析器,只是“#{javascript”。
之后的位这样做的好处是你可以通过组合语言来获得更好的性能,因为只有部分语言被传递给解析器和文字字符串(这就是“/ *”位)只是传递给浏览器,因为它是。这意味着您可以在单个值中包含EL和SSJS。如果您正在寻找改变,我不确定您是否能够做到这一点。
对于queryExpr,我建议使用$ {javascript:“ $ {0} ”}代替 - 只需转义{。请参见p121 XPages扩展库。