0

ビュー領域でこの問題が発生しました。この<g:select>タグonChangeには、選択したタグの値を参照するデータを取得するための属性があります。残念ながら、ページを更新しなくてもデータがのURIを介して取得されるように、<g:select>タグを内部に含めました。<g:formRemote><g:formRemote>

<!-- The g:formRemote of the view -->
<g:formRemote name="formRemote" uri:[controller:'test', action:'functionCall']>
   <g:select name="selectedValue" from="${['AA','BB']}"/>
   ${returnData}
</g:formRemote>

//The closure where the formRemote will be calling [TestController.functionCall]
def functionCall(){
   println 'entered'
   def returnData = ''
   if(params.value == 'AA')
      returnData = 'aaa'
   else if(params.value == 'BB')
      returnData = 'bbb'       

   [data:returnData]
}

<g:formRemote>問題は、の値を変更したときに、コントローラーからビューにモデルデータを取得する方法が見つからないことです<g:select>

4

2 に答える 2

0

selectタグはformRemoteタグ内にある必要はありません。remoteFunction呼び出しを使用した通常のフォームタグでうまくいきます。

http://grails.org/AJAX-Driven+SELECTs+in+GSPから:

gspでタグを選択します。

<form>
    <g:select
        optionKey="id" optionValue="name" name="country.name" id="country.name" from="${Country.list()}"
        onchange="${remoteFunction(
            controller:'country', 
            action:'ajaxGetCities', 
            params:'\\'id=\\' + escape(this.value)', 
            onComplete:'updateCity(e)')}"
    ></g:select>
    <g:select name="city" id="city"></g:select>
</form>

grailsコントローラーにデータを送信するgspのjavascript関数:

<g:javascript>
    function updateCity(e) {
        // The response comes back as a bunch-o-JSON
        var cities = eval("(" + e.responseText + ")")   // evaluate JSON

        if (cities) {
            var rselect = document.getElementById('city')

            // Clear all previous options
            var l = rselect.length

            while (l > 0) {
                l--
                rselect.remove(l)
            }

            // Rebuild the select
            for (var i=0; i < cities.length; i++) {
                var city = cities[i]
                var opt = document.createElement('option');
                opt.text = city.name
                opt.value = city.id
                try {
                    rselect.add(opt, null) // standards compliant; doesn't work in IE
                }
                catch(ex) {
                    rselect.add(opt) // IE only
                }
            }
        }
    }


    // This is called when the page loads to initialize city
    var zselect = document.getElementById('country.name')
    var zopt = zselect.options[zselect.selectedIndex]
    ${remoteFunction(controller:"country", action:"ajaxGetCities", params:"'id=' + zopt.value", onComplete:"updateCity(e)")}

</g:javascript>

grailsコントローラー:

import grails.converters.*
class CountryController {

    def ajaxGetCities = {
        def country = Country.get(params.id)
        render country?.cities as JSON
    }
}
于 2012-07-10T11:06:12.930 に答える
0

<g:formRemote>私たちは、理論が機能するためにタグが必要なかったことを最近知っています。以下の形式のonChange="${remoteFunction ...}"パラメーターがありません。<g:select tag>

<g:select 
   name="selectedValue"
   from="${['AA','BB']}" 
   optionKey="<the id of the model with reference to line#9>"
   onChange="${remoteFunction(
     controller:'test', 
     action:'functionCall',
     update:[success:'updateDiv'],
     params:'\'id=\' + escape(this.value)',
     onComplete='displayVal(this)')}"/>

updateDivもに配置されている場合.gsp、クロージャーを使用してコントローラーからレンダリングされるビューを保持する責任がありますfunctionCall

<div id="updateDiv"></div>

そして、この内容を持つTestController.functionCall:

def functionCall(){
   println 'entered'
   def returnData = ''
   if(params.value == 'AA')
      returnData = 'aaa'
   else if(params.value == 'BB')
      returnData = 'bbb'       

   render(view:'<can be a template or an html page>', model:[data:returnData])
}
于 2012-07-18T06:12:04.940 に答える