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。それの 2 番目のバリアント:

@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

このエラーのもう 1 つのよくある原因は、開始中かっこが別の行にあることです。

@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 に答える