2010-06-20 5 views
0

J'ai ce code dans un taglib personnalisé qui appelle la balise GrailsUI Autocomplete:Comment faire pour configurer un Param Dans un Taglib

def renderAutoComplete(uicName,isDisabled,theValue) { 

    params.tableId = 3 // THIS ISN'T AVAILABLE TO AUTO COMPLETE ACTION 

    out << gui.autoComplete(id:uicName,resultName:"lookUpData",controller:"lookupTable",action:"autoCompleteJSON") {} 

} 

Voici mon action qui se qu'on appelle à peupler la saisie semi-automatique:

def autoCompleteJSON = { 

    def lookupTable = LookupTable.get(3) // PARAM NEEDS TO BE SET IN TAGLIB 
    def list = LookupValue.findAllByLookupTableAndThevalueLike(lookupTable,"${params.query}%") 
    def jsonList = list.collect { [ id: it.id, name: it.thevalue ] } 
    def jsonResult = [ 
     lookUpData: jsonList 
    ] 
    render jsonResult as JSON //render only works in a controller 

} 

Tout fonctionne très bien à l'aide du CODA dur:

def lookupTable = LookupTable.get(3) 

mais de ce que je besoin est:

def lookupTable = LookupTable.get(params.tableId) 

et params.tableId n'est pas disponible pour l'auto-complétion.

Alors, comment puis-je définir un paramètre dans un taglib?

MISE À JOUR

Il se trouve que gui.autocomplete fournit deux params que je ne connaissais pas. filterBy et le filtre peuvent être utilisés pour le besoin précis de passer un paramètre de filtre à votre contrôleur. Alors maintenant, je fais:

out << gui.autoComplete(id:uicName,resultName:"lookUpData",controller:"lookupTable",action:"autoCompleteJSON",filterBy:"lookupTable",filter:"${theTagtype.lookupTable.id}", queryDelay:"0.5", value:"${theValue}") {} 

et il fonctionne parfaitement. Donc, mon problème immédiat est résolu. Mais la question générale demeure: Comment puis-je définir un param dans un taglib?

Répondre

1

Il semble un peu étrange que vous ayez besoin d'accéder aux paramètres dans la fermeture de votre tag, car la sortie ne devrait vraiment dépendre que des attributs du tag et du corps. Il est tout à fait possible que j'aie juste mal compris quelque chose, mais si vous avez besoin d'accéder à un paramètre de requête dans votre balise, je m'attendrais à ce que le flux ressemble davantage à ceci.

Tout d'abord dans le contrôleur, envoyer la valeur params au GSP Voir/Modèle:

//Some controller method 
def viewSomething = { 
    render(view:'viewWithTag', model:['tableId':params.tableId]) 
} 

Ensuite, dans votre GSP, définissez l'tableid comme un attribut sur l'étiquette de sorte qu'il n'a pas besoin de savoir quoi que ce soit sur les paramètres de demande directement:

... 
<renderAutoComplete tableId="${tableId}" /> 
... 

Ensuite, dans votre fermeture taglib:

def renderAutoComplete = { attrs, body -> 
    def t = Table.get(attrs.tableId) 
    ... 
} 

Espérons que cela aide! Si j'ai mal compris votre question, faites-le moi savoir.

Mise à jour:

D'accord, je pense que je comprends le point de confusion maintenant. Le rendu de la sortie de votre tag fait intrinsèquement partie de la réponse alors que les params intégrés font intrinsèquement partie de la requête. Votre balise ne peut donc pas définir directement les paramètres de la requête. Une partie de la fonctionnalité de gui.autoComplete et de son homologue YUI est qu'il génère l'URL qui sera utilisée plus tard pour envoyer une requête AJAX à votre action. Cette URL contient des paramètres de requête HTTP dans le formulaire typique? Nom = valeur. Grails va automatiquement les remplir dans la variable params disponible dans l'action.

Cela fonctionne de la même manière que le graphe createLink.Vous pouvez spécifier les paramètres de demande en définissant une valeur d'attribut params:

<g:createLink action='act' controller='cont' params="[foo: 'bar', boo: 'far'] />

Dans la mise en œuvre de createLink il couchait des paramètres HTTP et Grails se bousculent ceux dans params afin que vous les avez dans la logique du contrôleur. En aparté, vous pouvez également définir des paramètres de requête en incluant le même attribut params dans votre appel à gui: autoComplete. Je n'ai pas testé cela, mais le code qui est utilisé pour implémenter cela semble finalement faire un passage aux grails createLink et je pense que par coïncidence il peut définir les paramètres de la demande pour vous.

+0

Ce que je fais est de rendre un formulaire dynamiquement. Donc, renderAutoComplete est appelé depuis la fonction principale de mon taglib. Il y a aussi renderTextBox, renderSelect, etc. Je ne sais pas ce qui doit être rendu avant l'exécution. En fait, renderAutoComplete peut être appelé plusieurs fois et doit afficher des données différentes dans l'AC. J'avais besoin de définir la valeur de param dans mon taglib afin qu'elle soit disponible pour autoCompleteJSON, afin qu'elle puisse générer les données pour l'AC. Il s'est avéré que le taglib AC fourni ce dont j'avais besoin. Mais je soupçonne qu'il peut y avoir d'autres cas d'utilisation, donc je n'ai pas supprimé le? –

Questions connexes