Как установить параметр в Taglib - PullRequest
0 голосов
/ 20 июня 2010

У меня есть этот код в пользовательском taglib, который вызывает тег автозаполнения 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?

UPDATE

Оказывается, 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 Ответ

1 голос
/ 22 июня 2010

Кажется немного странным, что вам нужен доступ к параметрам в закрытии вашего тега, так как вывод должен действительно зависеть только от атрибутов тега и тела. Вполне возможно, что я что-то не так понял, но если вам нужен доступ к параметру запроса в вашем теге, я бы ожидал, что поток будет похож на этот.

Сначала в контроллере отправьте значение параметров в GSP View / Template:

//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 заключается в том, что он генерирует URL-адрес, который будет использоваться позже для отправки запроса AJAX вашему действию. Этот URL содержит параметры HTTP-запроса в типичной форме? Name = value. Grails автоматически подставит их в переменную params, доступную вам в действии.

Это работает так же, как и тег grails createLink. Вы можете указать параметры запроса, определив значение атрибута params:

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

В рамках реализации createLink он просто устанавливает параметры HTTP, а grails помещает их в параметры, чтобы они были в логике контроллера. Кроме того, вы также можете установить параметры запроса, включив тот же атрибут params в свой вызов gui: autoComplete. Я не проверял это, но код, который используется для реализации этого, кажется, в конечном итоге делает переход к grails createLink, и я думаю, что по совпадению он может установить параметры запроса для вас.

...