4

我刚开始使用播放框架。喜欢它,除了我在视图模板上遇到问题。

每当我直接在视图模板中包含 javascript 时,都会出现编译错误。这难道不能玩吗!模板?

@(title: String)(content: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
        <script src="@routes.Assets.at("javascripts/jquery-1.9.0.min.js")" type="text/javascript"></script>
    </head>
    <body>
<script>

function isEmpty(obj) {
    //for(var prop in obj) {
    //if(obj.hasOwnProperty(prop))
    try{
      if(JSON.stringify(obj)=='{}'){
        return true;
      }else{
        return false;
      }
    }catch(e){
      return false;
    }
  }

</script>

我收到错误“未解析?” 与函数 isEmpty(obj) {

先感谢您。

4

4 回答 4

4

即使你用//for 模板的解析器括号注释 JavaScript 行也是一个特殊的字符:

//for(var prop in obj) {

一般来说,Scala 模板中的括号具有特殊的含义,因此直接在视图中构建高级 JavaScript 会导致很多问题。您仍然需要控制 JS 中新的无害更改是否不会破坏模板解析器,反之亦然 - 如果模板解析器不会破坏您的脚本。最简单的解决方案是将 JS 从视图中分离出来,你有两个解决方案,我认为第一个更好:

  1. 将您的 JS 保存到公共*.js文件中并将其包含在<script src...>标签中。如果您需要从视图中传递一些数据,请先使用 global JS var:

    <script>var helloMessage = "Welcome on page @title";</script> 
    <script src="/path/to/your.js"></script>
    
  2. 在控制器中读取 JS 的内容file(不是 Scala 模板!)并将其作为 a 传递String给视图,您需要使用以下命令对其进行转义Html()

    @(title: String, mySpecialJS: String)(content: Html)
    <!DOCTYPE html>
    <html>
        <head>
            <title>@title</title>
            @Html(mySpecialJS)
        </head>
    <body>
    
  3. 您也可以加入这两种方法,例如,如果您想根据控制器/视图元素将复杂对象传递给 JavaScript,您还可以JSON在控制器中构建一个对象,将其转换为String然后包含带有 common 标签的 JS:

    @(title: String, myJsConfig: String)(content: Html)
    <!DOCTYPE html>
    <html>
        <head>
            <title>@title</title>
            <script>var myJsConfig = @Html(myJsConfig)</script> 
            <script src="/path/to/your.js"></script>
        </head>
    <body>
    

所以最后your.js你可以像往常一样使用它们:

alert(helloMessage);
console.log("Config is...");
console.log(myJsConfig);
于 2013-04-12T10:19:23.623 回答
3

错误实际上不在isEmpty()行。

如果您查看 Play 控制台,编译器输出指向不同的位置:

! @6e12h60d9 - Internal server error, for (GET) [/] ->

sbt.PlayExceptions$TemplateCompilationException: Compilation error[Not parsed?]
    at sbt.PlayCommands$$anonfun$43.apply(PlayCommands.scala:433) ~[na:na]
    at sbt.PlayCommands$$anonfun$43.apply(PlayCommands.scala:409) ~[na:na]
    at sbt.Scoped$$anonfun$hf5$1.apply(Structure.scala:581) ~[na:na]
    at sbt.Scoped$$anonfun$hf5$1.apply(Structure.scala:581) ~[na:na]
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:49) ~[scala-library.jar:na]
    at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311) ~[na:na]
[warn] play - No application found at invoker init
[error] C:\Users\maba\Development\play\layout\app\views\main.scala.html:14: Compilation error[Not parsed?]
[error]             //for(var prop in obj) {
[error]                               ^
[error] (compile:sources) @6e12hd81d: Compilation error in C:\Users\maba\Development\play\layout\app\views\main.scala.html:14
[error] application -

所以解析评论似乎有错误(目前不知道为什么)。

因此,如果您希望此代码运行,只需使用 Play 注释 ( @* some comment *@) 即可:

<script>

  function isEmpty(obj) {
    @*
    for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
    *@
    try{
      if(JSON.stringify(obj)=='{}'){
        return true;
      }else{
        return false;
      }
    }catch(e){
      return false;
    }
  }

</script>
于 2013-04-12T06:41:25.007 回答
0
 function isEmpty(obj) {
    try{
  if(JSON.stringify(obj)=='{}'){
    return true;
  }else{
    return false;
  }
}catch(e){
  return false;
}

}

于 2013-11-05T10:24:20.197 回答
0

正如@biesior 在第二点中描述的那样,@Html()从控制器打印代码(html/js)。但是我们可以在不作为参数传递的情况下编译它:

@Html(new String(
    """
    <script>

    </script>
    """)
)
于 2017-08-10T12:35:19.507 回答