9

我在 Play 2.0 模板中有以下代码:

@content.toString.lines.map{
    case line =>     // i put `case` here as another attempt to make it work
    line match {
        case "" => @Html("")
        case _ => <li>@Html(line)</li>   /*CRASH*/
    }   
}

它在标记线上失败,说not found: value line. 它的第二个变体:

@for(line <- content.toString.lines){
    @line match {                            /*CRASH*/
        case "" => @Html("")
        case _ => <li>@Html(line)</li>
    }   
}

在标记线上失败,声称'case' expected but identifier found.

更新:

同样的事情适用于val

@val headID = "head"

想出illegal start of simple expression

更新结束

我想知道,我做错了什么以及如何正确实现Play 模板中的match-case结构和分配?val

4

4 回答 4

26

match在模板中使用表达式

您需要用大括号(“{”和“}”)将模板的 HTML 内容括起来:

@for(line <- content.toString.lines) {
  @line match {
    case "" => { }
    case _ => { <li>@Html(line)</li> }
  }
}

在您的特定情况下,以下代码会更好地恕我直言:

@content.toString.lines.collect {
  case line if !line.isEmpty => { <li>@Html(line)</li> }
}

定义值

您可以使用帮助程序定义值defining[T](value: T)(usage: T => Html)

@defining(1 + 2 * 3) { value =>
  <div>@value</div>
}
于 2012-04-08T17:17:59.147 回答
4

我发现在外面添加一个 {} 来包含整个代码会起作用

@{content.toString.lines.map{ line => 
  line match {
    case "" =>  @Html("")
    case _ => <li>@Html(line)</li> 
}}  
于 2012-12-10T09:58:45.737 回答
1

以下似乎对我有用

@content.toString.lines.map{ line => 
    line match {
      case "" =>  @Html("")
     case _ => <li>@Html(line)</li> 
}  

眼睛很难看,但是您可以target/scala-2.9.1/src_managed/main/views/html/index.template.scala在 play 项目目录中查看它在字符串文字中的内容。

至于 val 分配,我不知道,但@defining可能会有所帮助

于 2012-04-08T10:45:53.250 回答
0

此错误的另一个常见原因是将起始大括号放在单独的行上:

@x match {
case y => 
  { //offending brace, put it back on the same line as case
  } //This can go anywhere
}
于 2014-12-14T05:05:23.947 回答