2011-10-27 10 views

risposta

21

Il motore di template nel gioco 2.0 proviene direttamente dal modulo di riproduzione 1.0 scala. Se ti stai ancora chiedendo quali vantaggi offre un linguaggio funzionale come Scala, questa è certamente una delle aree in cui brilla.

Dimostrazione:

Nella sintassi scala un tag non è altro che una chiamata di funzione. ciò che è interessante, è che i frammenti html sono considerati come funzioni stesse, consentendo i più potenti costrutti di sostituzione.

Definiamo una pagina html chiamata mytag.scala.html

di file: apps/vista/mytags/mytag.scala.html

@(level:String = "error", index: Int)(body: (String) => Html) 

@level match { 

    case "success" => { 
     <p class="success" index="@index"> 
      @body("green") 
     </p> 
    } 

    case "warning" => { 
     <p class="warning" index="@index"> 
      @body("orange") 
     </p> 
    } 

    case "error" => { 
     <p class="error" index="@index"> 
      @body("red") 
     </p> 
    }  
} 

Il tag prende superiore a 3 parametri in 2 distinti gruppi di parametri:

  1. un livello, rappresentato da una stringa (che di default è "errore")
  2. Un indice
  3. Infine una funzione chiamata body, che accetta un parametro stringa e restituisce il codice HTML. Si noti che il corpo è definito nel proprio gruppo di parametri. è equivalente a quello che sappiamo in j2ee come frammento jsp .

Ora vediamo come possiamo utilizzare questo tag:

@import views.mytags._ 

@mytag("error",2) { color => 
    Oops, something is <span style="color:@color">wrong</span> 
} 

Prima di poter utilizzare un tag (o funzione), abbiamo bisogno di lasciare Giocare sapere dove si trova: questo è lo scopo della importazione dichiarazione. Si noti che la posizione (il percorso) del file di tag è irrilevante fintanto che si modifica la posizione di importazione, proprio come con i pacchetti Java.

Segue la chiamata stessa, che è abbastanza semplice. Si noti tuttavia che stiamo passando un tag html parametrizzato al tag.

Per ulteriori dettagli, è possibile trovare la documentazione modello di scala a questo URL

Riproduci 2.0 finirà per venire con la propria documentazione.

4

Risposta completamente inutile ma solo per allenare la mia scala. Questo lavoro non dovrebbe essere più breve mentre si mantiene chiaro?

@(level:String = "error", index: Int)(body: (String) => Html) 

<p class="@level" index="@index"> 
    @body(
     @level match { 
     case "success" => "green" 
     case "warning" => "orange" 
     case "error" => "red" 
     } 
    ) 
</p> 
+0

Sinceramente non lo so, non è ancora un esperto di scala. sembra una buona domanda su SO. –

+0

Dovrei riprovare subito a giocare a 2.0. L'ultima volta, è stato davvero troppo crudo per i miei esperimenti! Non sono ancora un esperto di Scala ma imparo molto ed è l'unico linguaggio finora che mi dà l'impressione che potrei definitivamente spegnere Java alla fine;) – mandubian

+0

In questo caso, se il livello è qualcosa di diverso dal successo, avviso o errore, avrai un tag ap con quella classe css, che potrebbe non essere indenne. Nella risposta di @Olivier Refalo, verrà stampato solo un tag P se corrisponde a uno dei livelli di errore. – user3001

0

viene visualizzato un errore del compilatore quando ho utilizzato il primo esempio. Elimina le "visualizzazioni". nell'importazione risolto il problema

utilizzare mytags @import._ esempio

completa (http://www.playframework.com/documentation/2.1.1/JavaTemplateUseCases):

Let’s write a simple views/tags/notice.scala.html 
tag that displays an HTML notice: 

@(level: String = "error")(body: (String) => Html) 

@level match { 

    case "success" => { 
    <p class="success"> 
     @body("green") 
    </p> 
    } 

    case "warning" => { 
    <p class="warning"> 
     @body("orange") 
    </p> 
    } 

    case "error" => { 
    <p class="error"> 
     @body("red") 
    </p> 
    } 

} 

E ora lo si può usare da un altro modello:

@import tags._
@notice ("errore") {color => Oops, qualcosa non va}