2012-06-27 4 views
1

Je souhaite savoir si StringTemplate possède/supporte l'incrémentation d'un nombre.
La situation est la suivante:
entrée: est un tableau d'objets qui ont des getters "isKey() et getName()".
sortie doit être (i = 0; IF obj.getKey() ALORS ps.setObject (i ++, obj.getName)!) ENDIF):
ps.setObject(1,"Name");
ps.setObject(2,"Name");
ps.setObject(3,"Name");
...
StringTemplate: valeur d'incrémentation si if condition true

Actuellement, j'ai à côté ST: <objs:{<if(it.key)><else>ps.setObject(<i>, <it.name;>);<"\n"><endif>}>
Et la sortie dans le cas où le 1er est la clé:
ps.setObject(2,"Name");
ps.setObject(3,"Name");
ps.setObject(4,"Name");
...

problème maintenant je dois trouver un moyen de remplacer le 'i' avec quelque chose qui ne sera incrémenté que si la condition est vraie.

Les conseils de PLS qui ont fait face à ce roi de problème!

Répondre

0

En général, le changement d'état en réponse à l'obtention de l'état par ST n'est pas une bonne idée, donc numéroter les champs non-clés devrait se produire dans votre modèle, avant de commencer la génération avec. Ajouter un getter pour nonKeyIndex à la classe de votre modèle qui héberge la propriété name. Parcourez tous les frères et soeurs et numérotez-les selon vos besoins (c'est-à-dire en commençant par un seul et en ignorant les touches de votre numérotation). Maintenant, vous pouvez utiliser cette ST pour produire la sortie désirée:

<objs:{<if(it.key)><else>ps.setObject(<it.nonKeyIndex>, <it.name;>);<"\n"><endif>}> 

Parfois, il peut ne pas être possible d'ajouter des méthodes telles que nonKeyIndex à vos classes de modèle. Dans ce cas, vous devez envelopper vos classes en classes de vue spécifiquement conçus pour fonctionner avec le modèle de chaîne, et ajoutez les propriétés supplémentaires il y a:

public class ColumnView { 
    private final Column c; 
    private int nonKeyIdx; 
    public ColumnView(Column c) {this.c = c;} 
    public String getName() { return c.getName(); } 
    public boolean getKey() { return c.getKey(); } 
    public int getNonKeyIndex() { return nonKeyIdx; } 
    public void setNonKeyIndex(int i) { nonKeyIdx = i; } 
} 
+0

Thx pour votre réponse, c'était une sorte d'approche était un plan de sauvegarde pour moi. Aussi, je sautais sur le fait que ST aurait un soutien pour ce cas. Si pour préparer toutes les entrées manuellement juste pour l'impression alors, IMHO, StringTemplate n'est pas si conforme. – SairuS

+0

@SairuS C'est l'approche correcte, compte tenu de l'adhérence de ST au modèle MVC. C'est ainsi que je l'ai fait lors de mon dernier emploi qui a utilisé ST. – dasblinkenlight

+0

@SairuS "Si pour préparer toutes les entrées manuellement juste pour l'impression alors, IMHO, StringTemplate n'est pas si conforme" L'idée de ST est de déplacer la dépendance de sortie de votre code et dans votre runtime. Vous pouvez concevoir votre modèle une seule fois (c'est-à-dire «faire toutes les entrées manuellement»), puis écrire plusieurs ST pour produire des documents C++, Java et HTML pour votre projet, sans modifier une seule ligne de votre code Java. – dasblinkenlight