我刚开始使用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){
的行上提前谢谢。
答案 0 :(得分:4)
即使您使用//
评论JavaScript行,模板的解析器括号也是一个特殊的字符:
//for(var prop in obj) {
通常,Scala模板中的括号具有特殊含义,因此在视图中直接构建高级JavaScripts会导致许多问题。如果模板解析器没有破坏您的脚本,您还需要控制JS中的新无辜更改是否不会制动模板解析器,反之亦然。最简单的解决方案是将JS从视图中分离出来,你有两个解决方案,我认为首先是更好的:
将您的JS保存到常见的*.js
文件中,并将其包含在<script src...>
标记中。如果需要从视图中传递一些数据,请首先使用global JS var:
<script>var helloMessage = "Welcome on page @title";</script>
<script src="/path/to/your.js"></script>
在控制器中阅读JS file
(不是Scala模板!)的内容,并以String
的形式传递给视图,您需要使用Html()
转义它:
@(title: String, mySpecialJS: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
@Html(mySpecialJS)
</head>
<body>
您也可以加入这两种方法,例如,如果您想根据控制器/视图元素将复杂对象传递给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>
所以最后在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')