4

哇,这个标题真是满嘴了。让我解释。我有一个.jsp页面,在这个页面上有一个 JavaScript<script ..>元素,在 JavaScript 里面有一个 EL 表达式 ( ${..})。代码如下所示:

<script type="text/javascript">
  jQuery(document).ready(function() {
    var HOST_ID = ${host.id};
    ...
  });
</script>

问题:
Eclipse JavaScript 格式化程序将默认扩展${host.id}为多行。我猜测 EL 表达式以某种方式被解释为 JavaScript 对象。无论如何,标签最终会变成这样:

var HOST_ID = $
{
  host.id
}
;

=> 这实际上破坏了代码!

如果拆分为多行,则该标记不再被识别为有效的 EL 表达式,并且 JavaScript 代码的执行将停止抛出异常。

// @formatter:off我知道一种使用标签(或)关闭 Java 格式化程序中的即席格式化的方法,on但是 Eclipse 中的 JavaScript 格式化程序没有这样的选项。


解决此问题的唯一方法(读取解决方法)是强制 JavaScript 格式化程序从不扩展对象。但这在两个方面存在问题:

  • 不扩展对象可能会非常混乱并导致代码极其不可读。
  • 在多行上展开对象是Eclipse JavaScript 格式化程序中的默认设置。

这意味着,如果我的团队中的任何成员意外地自动格式化了.jsp包含所描述结构的文件,则代码将静默中断。它看起来仍然像有效的 JS,并通过了构建等,但在执行时它不起作用。


有没有人对此有任何解决方案?最好的解决方案是使用 Java 格式化程序中使用的标记以某种方式禁用格式化(此解决方案无需强制执行公司/团队范围的格式化程序标准或希望没有人会意外地按 Shift+Ctrl+F)。

4

2 回答 2

2

在我写这篇文章时,公认的解决方案建议将 EL 表达式用单引号括起来作为问题的解决方案。如果您决定这样做并且 EL 表达式中的值是布尔值,请非常小心,因为该值现在是 Javascript 中的字符串,并且条件比较可能无法按预期工作......

假设您有一个布尔变量 host.isActive 并且值为 true。

var HOST_IS_ACTIVE1 = ${host.isActive}; // var type is boolean in Javascript

if (HOST_IS_ACTIVE1 == true) {
  // this code will be executed
}

if (HOST_IS_ACTIVE1 == 'true') {
  // this code will not be executed
}

var HOST_IS_ACTIVE2 = '${host.isActive}'; // var type is string in Javascript

if (HOST_IS_ACTIVE2 == true) {
  // this code will NOT be executed
}

if (HOST_IS_ACTIVE2 == 'true') {
  // this code will be executed
}
于 2014-07-30T15:53:42.860 回答
0

显然,可以将 EL 表达式用单引号括起来。这将使它们看起来像 JavaScript 中的字符串,但它们仍将被评估为 EL 表达式。

如此变化

var HOST_ID = ${host.id};

var HOST_ID = '${host.id}';

实际上可以解决问题。Eclipse JavaScript 格式化程序现在将表达式视为一个字符串并且不会对其进行扩展。问题解决了。

于 2012-11-29T09:17:45.980 回答