如何在Taglib中设置参数

时间:2010-06-20 08:48:52

标签: grails taglib

我在自定义taglib中有这个代码,它调用GrailsUI Autocomplete标记:

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") {}

}

这是我的动作,可以调用自动填充程序来填充:

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

}

使用硬编码的一切正常:

def lookupTable = LookupTable.get(3)

但我需要的是:

def lookupTable = LookupTable.get(params.tableId)

和params.tableId不可用于自动完成。

那么如何在taglib中设置参数?

更新

事实证明,gui.autocomplete提供了两个我不知道的参数。 filterBy和filter可用于精确地将过滤器参数传递给控制器​​。现在我做了:

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

它完美无缺。所以我的问题就解决了。但一般的问题仍然存在:如何在taglib中设置参数?

1 个答案:

答案 0 :(得分:1)

你需要访问标签关闭中的params似乎有点奇怪,因为输出实际上只取决于标签属性和正文。我很可能误解了一些东西,但是如果你需要访问标签中的请求参数,我希望流程更像是这样。

首先在控制器中,将参数值发送到GSP视图/模板:

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

然后在您的GSP中,将tableId设置为标记上的属性,以便它不需要直接了解有关请求参数的任何内容:

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

然后在你的taglib闭包中:

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

希望这有帮助!如果我误解了你的问题,请告诉我。

更新:

好的,我想我现在明白了这一点。渲染标记的输出本身就是响应的一部分,而内置参数本身就是请求的一部分。因此,您的标记无法直接设置请求参数。 gui.autoComplete及其YUI对应部分的部分功能是它生成稍后将用于向您的操作发送AJAX请求的URL。该URL包含典型的?name = value表单中的HTTP请求参数。 Grails会自动将这些填充到动作中可用的params变量中。

这与grails createLink标签的工作方式大致相同。您可以通过定义params属性值来指定请求参数:

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

在createLink的实现中,它只是设置HTTP参数,而grails将它们推入params,以便在控制器逻辑中使用它们。另外,您也可以通过在调用gui:autoComplete时包含相同的params属性来设置请求参数。我没有对此进行过测试,但用于实现此功能的代码似乎最终会传递给grails createLink,我认为巧合的是它可以为您设置请求参数。