0

GrailsUIオートコンプリートタグを呼び出すカスタム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にパラメータを設定するにはどうすればよいですか?

アップデート

gui.autocompleteは、私が気付いていなかった2つのパラメーターを提供していることがわかりました。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

出力は実際にはタグの属性と本文にのみ依存する必要があるため、タグクロージャのパラメータにアクセスする必要があるのは少し奇妙に思えます。何かを誤解している可能性は十分にありますが、タグのリクエストパラメータにアクセスする必要がある場合は、フローが次のようになると思います。

最初にコントローラーで、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変数にそれらを自動的に入力します。

これは、grailscreateLinkタグとほぼ同じように機能します。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 に答える