2010-06-20 3 views
0

У меня есть этот код в пользовательском TagLib, который вызывает GrailsUI автозаполнения тег:Как установить Param In A TagLib

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 обеспечивает еще два Params, что я не был в курсе. filterBy и фильтр могут использоваться для того, чтобы точно передать параметр фильтра вашему контроллеру. Так что теперь я делаю:

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

и он отлично работает. Поэтому моя ближайшая проблема решена. Но остается общий вопрос: как установить параметр в taglib?

ответ

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) 
    ... 
} 

Надеюсь, это поможет! Если я неправильно понял ваш вопрос, дайте мне знать.

Update:

Хорошо, я думаю, я понимаю точку путаницы в настоящее время. Рендеринг вывода вашего тега является неотъемлемой частью ответа, тогда как встроенные параметры неотъемлемо являются частью запроса. Поэтому ваш тег не может напрямую устанавливать параметры запроса. Часть функций 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 так, что вы их в логике контроллера. В стороне вы также можете задать параметры запроса, включив в свой вызов атрибут params в gui: autoComplete. Я не тестировал это, но код, который используется для реализации этого, кажется, в конечном счете, проходит через grails createLink, и я думаю, что по совпадению он может установить для вас параметры запроса.

+0

Что я делаю, это динамическое преобразование формы. Таким образом, renderAutoComplete фактически вызывается из основной функции в моем taglib. Также есть renderTextBox, renderSelect и т. Д. Я не знаю, что нужно отображать до запуска. На самом деле renderAutoComplete может вызываться несколько раз, и нужно отображать разные данные в AC. Мне нужно было установить значение параметра в моем taglib так, чтобы оно было доступно для autoCompleteJSON, чтобы оно могло генерировать данные для AC. Оказалось, что AC taglib предоставил то, что мне нужно. Но я подозреваю, что могут быть другие варианты использования, поэтому я не удалял?. –