2014-06-05 20 views
5

Come si restituiscono i valori da un taglib che è stato chiamato in un'azione del controllore in modo tale che esso mantenga automaticamente l'intera struttura del tipo dell'impostazione dei valori nel taglib?Grails: Restituzione di parametri da un taglib

Posso usare l'approccio out << ma restituisce stringhe o array di stringhe.

Ho provato a utilizzare un mapping [] come trasferisce una serie di valori alla fine di un'azione alla sua vista.

Ho anche provato nuovamente un'istruzione return - inoltre ho bisogno di restituire più di un set di valori.

-Mike

+1

Il 'returnObjectForTags' potrebbe funzionare ma, a seconda di ciò che si sta provando a fare, potrebbe essere che una tag lib sia la cosa sbagliata del tutto qui. Puoi descrivere cosa stai facendo con il tag lib? –

+0

Ho provato a utilizzare returnObjectForTags con un tag, ma non posso ancora lavorare. Forse un servizio è un'opzione migliore. Ecco i taglib: – mikek

+0

Non è molto chiaro quello che stai cercando di fare ma nella tua descrizione non c'è nulla che suggerisca che un tag lib abbia un senso. –

risposta

6

dalla parte superiore della documentazione http://grails.org/doc/latest/guide/theWebLayer.html#tagReturnValue

class ObjectReturningTagLib { 

    static returnObjectForTags = ['content'] 

    def content = { attrs, body -> 
    someValue() 
    } 
} 
+0

Sto tentando di restituire una lista array di istanze selezionate di un modello di dominio e anche la dimensione della matrice. Sto usando un taglib per modulare il codice che ha creato questo ArrayList in un controller/azione. – mikek

+1

Sembra qualcosa che dovrebbe probabilmente essere in un servizio. –

+0

@Scott Forse un servizio è un'opzione migliore - non sono sicuro della differenza con un taglib. Il taglib ha una serie di chiamate ".where" al dB. Ho dovuto abbreviare le cose qui sotto. Il valore di ritorno è un ArrayList di istanze PublishedShr che passare a una vista dall'azione: '\t def getPubVidList = {attrs, corpo-> \t \t def currOrganId = attrs [ "visitorOrgan"] \t \t def queryMKP = PublishedShr .dove { \t \t \t videoId in pubMkLstV \t \t} \t \t def pubMkLstP = queryMKP.list() \t \t def pubMkLstTotal = queryMKP.count() \t \t return pubMkLstP } // end getPubVidList' – mikek

0

credo che questo potrebbe risolvere il tuo problema

package com.campaign 
import java.util.*; 
class UserDetailsTagLib { 
def springSecurityService 
static namespace = "jft" 
#here we are defining that this getPrincipal and getArrayListAsObj tag used to return  object 
static returnObjectForTags = ['getPrincipal','getArrayListAsObj'] 
#this tag will return obj 
def getPrincipal = { 
    return springSecurityService.principal 
} 
# this tag is used to return the array list of string 
def getArrayListAsObj = { attrs , body -> 
    ArrayList arrayList = new ArrayList(); 
    arrayList.add("C"); 
    arrayList.add("A"); 
    arrayList.add("E"); 
    arrayList.add("B"); 
    arrayList.add("D"); 
    arrayList.add("F"); 

    return arrayList 

} 

}

+0

Ho provato quanto sopra ma ottengo ancora una lista di stringhe restituita dal taglib. Ecco la chiamata nel controller: 'def pubMkLstP = getPubVidList (visitorOrgan: currOrganId)' Non sono sicuro se avessi intenzione di includere una versione del 2 ° taglib getAppConfigData - Ho comunque aggiunto una versione modificata senza successo: '\t def getAppConfigData = { attrs, body -> \t \t out << (pubMkLstP.appConfig.configData. "$ {attrs.key}") ?. encodeAsHTML() \t} '. sostituendo il valore principale con il mio valore. Qualsiasi aiuto sarebbe apprezzato? – mikek

+0

in sopra data risposta, ho dichiarato due tag. primo è getPricipal che viene utilizzato per ottenere l'oggetto principale dalla sessione e restituire l'oggetto. e il secondo tag è getAppConfighData che è un altro tag e non lo restituisce, basta scrivere il valore k specificato nella risposta. –

+0

Ora sto creando ArrayList nel taglib - una serie di istanze di modello. Quando lo restituisco al controller/azione non lo esegue correttamente. Cercando di stampare ArrayList nell'azione viene visualizzato un errore "Nessuna firma del metodo (SLF4JLog)". Ha restituito correttamente ArrayList ma come elenco di stringhe. Il ritorno: 'tornare pLst' La chiamata è:' def PLST = getPubVidList (visitorOrgan: currOrganId) ' Ho aggiunto getAppConfigData non sicuro di quello che sto facendo in verità - la linea out:' fuori < <(pLst.appConfig.configData. "$ {attrs.key}") ?. encodeAsHTML() ' -mike – mikek

0

Capisco il tuo problema. Se vuoi avere l'Intellisense sul var ottenuto da un taglib, l'unica cosa che puoi avere è questa (è un po 'ridondante)

In un gsp per esempio, se hai un TagLib con namespace myTaglib:

Prima chiamata l'azione del taglib per impostare il valore di una var:

<myTaglib:person var="currentUserFromTaglib" /> 

Dove il tag person nel myTaglib è proprio per questo scopo:

def person = { attrs -> 
     this.pageScope."$attrs.var" = new Person(name:'Giuseppe', surname:'Iacobucci') 
    } 

Dopo questo, è necessario scrivere:

<g:set var="currentUser" value="${currentUserFromTaglib as Person}"/> 

e comprendono in voi GSP:

<%@ page import="your.package.Person" %> 

Dopo di che, nel GSP currentUser è riconosciuto come tipo Person.

In un controller, è sufficiente chiamare il myTaglib e lanci il risultato in questo modo:

def myvar = myTaglib.person() as Person 

Ovviamente se avete bisogno di più di un oggetto complesso, come ho letto dai vostri commenti, quindi creare un oggetto di interfaccia utente semplice con tutte le informazioni di cui hai bisogno all'interno e fai lo stesso trucco.