我在自定义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中设置参数?
答案 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,我认为巧合的是它可以为您设置请求参数。