2010-06-11 24 views
1

J'ai ma configuration d'environnement bien en utilisant Scala, StringTemplate dans Google App Engine. J'ai du mal à faire défiler une carte et à l'afficher dans le modèle. Quand je Confiez une mission simple Liste des chaînes seulement au modèle, il fonctionne à l'aide:Utilisation de Scala et StringTemplate, comment faire une boucle dans une carte

Scala Servlet:

var photos = List[String]() 

    //... get photo url and title ... 

    photos = photo_url :: photos 
    template.setAttribute("photos", photos: _*) 

Dans Modèle:

$photos: { photo| 
    <div><img src="$photo$_s.jpg"></div> 
    }$ 

Les travaux ci-dessus. Cependant, toute tentative de création d'une carte à l'aide de l'URL et du titre et de l'affectation au modèle me donne une erreur. Voici ma tentative, ce qui ne fonctionne pas:

Scala Servlet:

var photos = List[Map[String,String]]() 

    //... get photo url and title ... 

    photos = Map("url" -> url, "title" -> title) :: photos 
    template.setAttribute("photos", photos: _*) 

Dans Modèle:

$photos: { photo| 
    <div><img src="$photo.url$_s.jpg" title="$photo.title$"></div> 
    }$ 

Cela me donne l'erreur suivante

Class scala.collection.immutable.Map$Map2 has no such attribute: title in template context 

Pensées/Des idées?

+0

supprimé ma suggestion - je suis juste ici que mon remarquer simple idée de créer classe 'cas TitleURL (url: String, titre: String)' et l'utiliser à la place de la carte ne fonctionne pas. Selon Marcus, il génère une erreur comme "Classe FlickrTestServlet $ TitleURL $ 2 n'a pas un tel attribut: titre dans le contexte du modèle [templates/flickr_template if (photos) _subtemplate anonyme]". –

Répondre

3

Faisant suite à la suggestion de Rex, j'ai pu le faire fonctionner en utilisant une classe de cas avec une annotation @BeanProperty pour les champs:


case class MyPhoto(@BeanProperty val url: String, @BeanProperty val title: String) 

def generateMyPhotos() : String = { 
    val tp = new StringTemplate("$photos: { photo|<div><img src=\"$photo.url$_s.jpg\" title=\"$photo.title$\"></div>}$") 
    val photos = List(MyPhoto("http://myphoto.com", "my photo")) 
    tp.setAttribute("photos", photos: _*) 
    tp.toString 
} 

Cela a fonctionné pour moi (en utilisant la bibliothèque scalasti pour StringTemplate, comme vous probablement aussi déjà fait).

+0

Génial, ça a marché! Je vous remercie!! Oui, j'utilise wrapper scalasti pour StringTemplate. La seule chose que je devais faire était d'ajouter une importation pour l'importation Bean Property scala.reflect._ –

0

Il existe une alternative simple, sans utiliser de paquetages et d'annotations supplémentaires. Enregistrez un adaptateur d'objet scala qui sait comment extraire les valeurs de propriété des objets scala et des collections scala.

Ceci est maintenant inclus dans la FAQ StringTemplate à: http://www.antlr.org/wiki/display/ST4/Altering+property+lookup+for+Scala