2012-10-03 3 views
0

J'ai le problème suivant. J'ai créé un taglibrary qui énumère la collection donnée si les données comme suitGrails taglib réinitialisation des propriétés

class LisTagLib { 

     static final CONTEXT = this.class.name 
     /** 
     * Current data from collection 
     */ 
     def currentData; 
     String columnHeaders = ""; 
     List writtenHeaders = []; 

     // draw main table 
     Closure listTable = { attrs, body -> 

      def writer = getOut() 

      writer << "<table>"; 
      writer << "<thead>" 
      writer << "<tr>" 
      writer << columnHeaders 
      writer << "</tr>" 
      writer << "</thead>" 
      writer << "<tbody>" 

      if(attrs.source){ 
       attrs.source.each() { value -> 
        writer << "<tr>"; 
        writer << body() 
        writer << "</tr>"; 
       } 
      } 

      // output the body 
      writer << "</tbody>"; 
      writer << "</table>"; 
     } 
. 
. 
. 
} 

Mon problème est « ColumnHeaders » la propriété est pas créé chaque fois que j'appelle cela taglib. Si j'appelle cela comme à la page X puis à la page Y, la page Y a aussi les en-têtes comme «en-têtes montrés à la page X + en-têtes montrés à la page Y». J'ai essayé le constructeur mais cette classe est construite seulement une fois au moment de la compilation. Quelle est la solution pour cela. Comment puis-je réinitialiser ces valeurs chaque fois que j'appelle ce taglib? Par ailleurs appeler quelque chose comme

columnHeaders = ""; 

au début ou à la fin de la fermeture listTable supprime les tous ColumnHeaders et aucun en-tête est imprimé.

Répondre

3

Les étiquettes étant des singletons, les champs de portée de classe tels que currentData, columnHeaders et writtenHeaders sont partagés par toutes les demandes. Les haricots de printemps par défaut sont des singletons, et c'est le cas dans Grails, sauf pour les contrôleurs qui sont créés par requête et peuvent avoir un état (mais ne devraient pas). La solution est de déplacer ces champs dans votre corps de variable en tant que variables et de les passer aux méthodes auxiliaires en tant qu'arguments si nécessaire, au lieu de les désigner comme des champs de classe.

p.s. perdre les points-virgules :)

Questions connexes