简体   繁体   中英

Grails: Returning parameters from a taglib

How do I return values from a taglib that has been called in a controller action such that it automatically retains the full type structure of the values setup in the taglib?

I can use the out << approach but this returns strings or array of strings.

I have tried to use a [] mapping as used transfer a set of values at the end of an action to its view.

I have also tried a return statement again unsuccessfully - besides I need to return more than one set of values.

-mike

from the top of the documentation http://grails.org/doc/latest/guide/theWebLayer.html#tagReturnValue

class ObjectReturningTagLib {

  static returnObjectForTags = ['content']

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

I think this could solve your problem

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

}

}

I understand your problem. If you want to have the Intellisense on the var you got from a taglib, the only thing you can have is this (it's a little redundant)

In a gsp for example, if you have a TagLib with namespace myTaglib:

First call the action of your taglib to set the value of a var:

<myTaglib:person var="currentUserFromTaglib" />

Where the person tag in the myTaglib is just for this purpose:

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

After this, you need to write:

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

And include in you gsp:

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

After that, in the gsp currentUser is recognized as type Person .

In a controller, you simply call the myTaglib and cast the result like so:

def myvar = myTaglib.person() as Person

Obviously if you need more a complex object as I read from your comments, then create a plain UI object with all information you need inside and do the same trick.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM