【问题标题】:Play framework Twirl template comparing javascript element and scala variable播放框架 Twirl 模板比较 javascript 元素和 scala 变量
【发布时间】:2016-08-26 01:46:59
【问题描述】:

如下面的代码示例所示,我想比较一个 scala 辅助元素中的 javascript 元素。但是,即使存在元素“abcde”,它也总是返回 false。除了使用标签之外,如何获取 scala 辅助元素中的 javascript 值?

@(appSeq:Seq(String))
<script>
var app = 'abcde'
@if(appSeq.contains(<script>app</script>)) {
   alert('true');
} else {
   alert('false');
}
</script>

【问题讨论】:

    标签: javascript scala playframework


    【解决方案1】:

    因为这个原因是不可能的:

    • var app = 'abcde' 在 JS VM 中评估
    • 在 Java VM 中评估 XML 文字 &lt;script&gt;app&lt;/script&gt;)

    因此,由于它们是两个不同的上下文,因此您不能将变量从 JS 共享到 Scala。你可以做的是将一个变量从 Scala 传递给 JS,因为 Scala 代码首先被评估并且所有的值都将在模板中呈现。

    您需要在 Scala XML 中硬编码 'abcde',或者更好地将其分配给 Scala 值,例如:

    @(appSeq:Seq(String))
    @app="abcde"
    <script>
    var app = "@app"
    @if(appSeq.contains(<script>$app</script>)) {
       alert('true');
    } else {
       alert('false');
    }
    </script>
    

    【讨论】:

      【解决方案2】:

      你的问题不是很清楚,但在 scala 中使用 javascript 变量是不可能的。视图已编译,然后您将一些变量传递给此视图,结果 play/twirl 将其呈现为 http 响应。之后你在前端区域,根本就没有 scala。

      所以最好将你的逻辑移到前端。如果您只想包含一次检查,那么您可以像这样完成它;

      @(appSeq:Seq[String], app: String)
      <script>
      var app = "@app"
      
      @if(appSeq.contains(s"<script>$app</script>")) {
      alert('true');
      } else {
      alert('false');
      }
      </script>
      

      但如果您想这样做,请在前端再次检查。最好将 appSeq 作为 javascript 数组传递到前端并在 javascript 对象上包含 javascript。

      这里是用js解释contain for array的链接。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2019-02-07
        相关资源
        最近更新 更多