6

he el siguiente código de Juego 2.0 plantilla:Juega 2.0 de plantillas - Scala `` match` y val` no compilan en una plantilla de vista

@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*/ 
    } 
} 

Se produce un error en la línea marcada, diciendo que not found: value line. La segunda variante de la misma:

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

falla en la línea marcada, afirmando que 'case' expected but identifier found.

ACTUALIZACIÓN:

Lo mismo ocurre con val:

@val headID = "head" 

viene con illegal start of simple expression.

ACTUALIZACIÓN EXTREMOS

Me gustaría saber, ¿qué estoy haciendo mal y cómo implementar correctamente la estructura match-case y val asignación en las plantillas de jugar?

Respuesta

22

El uso de expresiones en las plantillas match

Es necesario para encerrar entre llaves (“{” y “}”) el contenido HTML de sus plantillas:

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

En su caso específico, el siguiente código sería el siguiente mejor en mi humilde opinión:

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

valores que definen

Se pueden definir los valores utilizando el defining[T](value: T)(usage: T => Html) ayudante:

@defining(1 + 2 * 3) { value => 
    <div>@value</div> 
} 
1

siguiente parece funcionar para mí

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

duro en los ojos, pero se puede ver en target/scala-2.9.1/src_managed/main/views/html/index.template.scala en el directorio del proyecto de reproducción para ver lo que su puesta en literales de cadena.

En cuanto a la asignación val, no sé, pero puede ayudar a @defining

4

He descubierto que añadir un {} fuera para encerrar código completo funcionaría

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

Salvavidas! Después de rascarme la cabeza por más de una hora en esta, descubrí que esto también me funcionaba. Totalmente inesperado ya que tengo otros archivos dentro del mismo proyecto, prácticamente idénticos en estructura, que no necesitan esto y la única diferencia posible es que estoy usando un campo de un parámetro que pasa en oposición a un parámetro que se pasa (@xf versus @x) SIN EMBARGO, edité el código e intenté pasar el param directamente y todavía no compilaría. Pensé que podría ser .xml versus .html y eso tampoco hizo la diferencia.¡Gracias por la respuesta! – Techmag

+0

En un caso del más allá bizarro, lo que sea que comencé a compilar de repente - fue errar CON las llaves (cura milagrosa) envueltas y luego cuando las quité los nuevos errores desaparecieron pero el archivo completo se compiló limpiamente. Intenté rápidamente anular todos los cambios que había hecho en las últimas dos horas para ver si podía obtener un golpe sobre el verdadero culpable aquí, pero fue en vano. Sugeriría profundizar más si esto te sucede a ti, ya que las llaves de alguna manera ocultan un problema más profundo. – Techmag

0

Otra causa frecuente de este error es tener la llave de partida en una línea separada:

@x match { 
case y => 
    { //offending brace, put it back on the same line as case 
    } //This can go anywhere 
} 
Cuestiones relacionadas