2011-10-27 3 views

Répondre

21

Le moteur de gabarit en jeu 2.0 provient directement du module scala de lecture 1.0. Si vous vous demandez encore quels avantages un langage fonctionnel tel que Scala apporte à l'image, bien c'est certainement l'un des domaines où il brille.

Démonstration:

Dans la syntaxe scala une balise est rien d'autre qu'un appel de fonction. Ce qui est intéressant, c'est que les fragments html sont considérés comme des fonctions elles-mêmes, permettant les constructions de substitution les plus puissantes.

Définissons une page html appelée mytag.scala.html

fichier

: apps/vues/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> 
    }  
} 

La balise ci-dessus prend 3 paramètres 2 distincts groupes de paramètres:

  1. un niveau, représentée par une chaîne (qui est par défaut "erreur")
  2. Un index
  3. Enfin une fonction appelée body, qui prend un paramètre string et renvoie du code HTML. Notez que le corps est défini dans son propre groupe de paramètres. il est équivalent à ce que nous connaissons dans j2ee sous la forme d'un fragment jsp.

Maintenant, nous allons voir comment nous pouvons utiliser cette balise:

@import views.mytags._ 

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

Avant de pouvoir utiliser une balise (ou la fonction), nous devons laisser le jeu savoir où il se trouve: c'est le but de la déclaration. Notez que l'emplacement (le chemin) du fichier de balise n'est pas pertinent tant que vous ajustez l'emplacement d'importation, tout comme avec les packages Java. Suit l'appel lui-même, ce qui est assez simple. Notez cependant que nous passons un fragment html paramétré à l'étiquette.

Pour plus de détails, vous pouvez trouver la documentation du modèle de scala à ce URL

Jouer 2.0 finira par venir avec sa propre documentation.

4

Réponse totalement inutile mais juste pour former ma scala. Cela ne fonctionnerait-il pas et serait plus court tout en restant clair?

@(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

Honnêtement, je ne sais pas, pas encore un expert en scala. ressemble à une bonne question sur SO. –

+0

Je devrais réessayer play2.0 bientôt. La dernière fois, c'était vraiment trop dur pour mes expériences! Je ne suis pas encore un expert de Scala mais j'apprends beaucoup et c'est le seul langage jusqu'à présent qui me donne l'impression que je pourrais définitivement éteindre Java à la fin;) – mandubian

+0

Dans ce cas, si le niveau est autre que le succès, avertissement ou erreur, vous aurez une balise AP avec cette classe CSS, qui pourrait ne pas être induite. Dans la réponse de @Olivier Refalo, une étiquette P seulement sera imprimée si elle correspond à l'un des niveaux d'erreur. – user3001

0

Je reçois une erreur de compilation, lorsque j'ai utilisé le premier exemple. Supprimez les "vues". dans l'importation résolu le problème

utilisez @import mytags._

Exemple complet (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> 
    } 

} 

Et maintenant, nous allons l'utiliser à partir d'un autre modèle:

@import tags._
@notice ("erreur") {color => Oups, quelque chose ne va pas}

Questions connexes