2

我在 XPage 中有一个奇怪的行为,带有注释代码。

我有一个包含大量代码的文本字段,它在我遇到这个问题的地方输出 html。在开发过程中,我在其他字段的某些字段上遇到了很多麻烦,因此我决定 - 为了更好地了解该字段正在做什么 - 将代码从故障字段复制到我的文本字段内的注释中,以便让其他代码出现在我的视线中。但是在我发现问题之前,xPage 开始表现得很奇怪。

下面的代码是导致我的问题的一个示例,它有两个文本字段,其中一个设置范围变量,还有一个设置相同变量但已注释的注释,另一个显示 ScopeVar。我以为这会在第二个文本框中输出“我在哪里”,但我得到了“呼呼我在这里”。

        <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 保留在代码中间的注释中。结果相同。如果您在评论中使用 #{ 或 ${ ,它将始终被计算!

在注释 9 中解决了这个问题。我目前使用的是 8.5.3。

更新: 作为一个小提示:使用 dojoAttribute queryExpr 时要小心,因为查询看起来像 SSJS"${0}"并且也被解释为 SSJS。我现在使用这个:

<xe:this.queryExpr><![CDATA[${javascript:"*$\{0}*";}]]></xe:this.queryExpr>

让它工作。感谢Paul Stephen Withers提供的\{.

4

2 回答 2

1

这是一个有趣的错误。

它是由 JavaScript 解释器的预处理器功能引起的。通常,您可以编写#{javascript:...}CSJS 代码来替换部分代码,然后再将其放入渲染页面。

在您的情况下,它是 SSJS。同样,解释器替换了#{javascript:...}您的 SSJS 代码内部并认为,工作已经完成。这样您就可以在渲染页面上看到代码,而不是执行代码的结果。

呈现的页面

作为一种解决方法,只需从中删除#/* #{javascript...它就会像预期的那样工作。

于 2013-10-30T10:32:07.380 回答
1

在您的示例中,是否有理由将 #{javascript:...} 嵌套在 #{javascript:...} 内。我强烈建议不要这样做,我不希望它会产生好的结果。

另请参阅我对在 JS 代码中停止 getClientId() 计算的回答。我认为您期望它以一种未经设计且不太可能更改为工作的方式工作。

属性只是在运行时从左到右读取的字符串。如果找到“#{javascript:”、“${javascript:”或“#{..”,则运行生成的代码。在它们周围包裹“//”或“/ ”和“ /”任何一方都没有效果,我也不希望它。整个字符串不会传递给解析器,只是“#{javascript”之后的位。

这样做的好处是您可以通过组合语言获得更好的性能,因为它只有一部分被传递给解析器,而文字字符串(即“/*”位是什么)只是按原样传递给浏览器。这意味着您可以将 EL 和 SSJS 包含在一个值中。如果进行了您正在寻找的更改,我不确定您是否能够做到这一点。

对于 queryExpr,我建议改用 ${javascript:" ${0} "} - 只是转义 {。请参阅 p121 XPages 扩展库。

于 2014-02-05T14:02:30.893 回答