玩! 2.1.1模板中的框架javascript导致编译错误

时间:2013-04-11 23:41:02

标签: javascript scala playframework

我刚开始使用play框架。喜欢它,除了我的视图模板有问题。

每当我在视图模板上直接包含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 个答案:

答案 0 :(得分:4)

即使您使用//评论JavaScript行,模板的解析器括号也是一个特殊的字符:

//for(var prop in obj) {

通常,Scala模板中的括号具有特殊含义,因此在视图中直接构建高级JavaScripts会导致许多问题。如果模板解析器没有破坏您的脚本,您还需要控制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模板!)的内容,并以String的形式传递给视图,您需要使用Html()转义它:

    @(title: String, mySpecialJS: String)(content: Html)
    <!DOCTYPE html>
    <html>
        <head>
            <title>@title</title>
            @Html(mySpecialJS)
        </head>
    <body>
    
  3. 您也可以加入这两种方法,例如,如果您想根据控制器/视图元素将复杂对象传递给JavaScript,您还可以在控制器中构建JSON对象,转换它到String然后包含带有公共标记的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>
    
  4. 所以最后在your.js中你可以像往常一样使用它们:

    alert(helloMessage);
    console.log("Config is...");
    console.log(myJsConfig);
    

答案 1 :(得分:3)

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

如果查看Play Console,编译器输出指向不同的位置:

! @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 -

所以解析注释时似乎有错误(目前不知道原因)。

因此,如果您希望此代码运行,请使用播放评论(@* 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>

答案 2 :(得分:0)

 function isEmpty(obj) {
    try{
  if(JSON.stringify(obj)=='{}'){
    return true;
  }else{
    return false;
  }
}catch(e){
  return false;
}

}

答案 3 :(得分:0)

正如@biesior在第二点所述,'vendor/composer/autoload_static.php'从控制器打印代码(html / js)。 但我们可以编译它而不传递参数:

'Zend' => array(vendorDir . '/ZF2/library'),
    'ZendXml' => array(vendorDir . '/ZF2/library')