0

我在调用 GrailsUI 自动完成标记的自定义标记库中有此代码:

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 中设置参数?

4

1 回答 1

1

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

首先在控制器中,将参数值发送到 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 将这些参数放入参数中,以便您将它们放在控制器逻辑中。顺便说一句,您还可以通过在对 gui:autoComplete 的调用中包含相同的 params 属性来设置请求参数。我还没有对此进行测试,但是用于实现它的代码似乎最终会传递到 grails createLink,我认为巧合的是,它可能会为您设置请求参数。

于 2010-06-21T21:22:38.383 回答