Grails选择RemoteFunction不工作?

时间:2013-07-03 14:10:03

标签: ajax grails select

让我给一点背景。

我有一个域名模型,用于存储用户的说明数据,我有一个单独的域名模型,因为他们可以有更多的1,所以一个用户可以拥有多个电话号码。

我拥有存储在系统中的用户的数据,并为该用户说出2个电话号码。然后在页面上我有选择列表,用于在控制器上调用操作,然后将该用户电话号码数据传递回要呈现的视图。

每个元素的代码如下:

控制器功能:

def getNumbers = {

        def user = User.get(params.phoneId.toInteger())

        [phones: user.phones]
    }

视图:

<g:select id="users" name="user_field" from="${Users}" 
                optionKey="id" 
                optionValue="name" 
                noSelection="['':'-Choose a Name-']"
                onchange="${remoteFunction(action: 'getNumbers',
                                 update: [success: 'great', failure: 'ohno'],
                                 params: [userId: this.value ],
                                 options: '[asynchronous: false]')}" />


<g:each in="${phones?}" var="a" status="i">
                <div>

                 <g:textField name="number" required="" value="${phones?.data}"/>

                </div>
            </g:each>

运行此代码时,会调用Action getNumbers,但出于某种原因,我收到以下错误消息:

| Error 2013-07-03 14:25:37,700 [http-bio-8080-exec-1] ERROR errors.GrailsExceptionResolver  - NumberFormatException occurred when processing request: [POST] /app/user/getNumbers - parameters:
userId: null
For input string: "null". Stacktrace follows:
User: For input string: "null"

奇怪的是,传递的参数将为null,因为我从此列表中的数据也会通过下面的JavaScript显示在页面上的文本框中,并且值不为空且显示正确:

document.getElementById("verification").innerHTML = "<br />" + this.value;

我希望有人可以帮助我纠正这个问题,甚至告诉我另一种方法来实现我想要的目标。

提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试这些步骤:

1 - 创建模板:_phones.gsp

<g:each in="${phones?}" var="a" status="i">
   <option value="${phones?.data}">${phones?.data}</option>
</g:each>

2 - 在您的第一个选择中:

<g:select id="users" name="user_field" from="${Users}" 
            optionKey="id" 
            optionValue="name" 
            noSelection="['':'-Choose a Name-']"
            onchange="${remoteFunction(action: 'getNumbers',
                             update: [success: 'great', failure: 'ohno'],
                             params: '\'userId=\'+this.value',
                             options: '[asynchronous: false]')}" />

3 - 在你的第二个选择中把这个:

<select id="great">
</select>

4 - 在您的控制器中:     def getNumbers = {

    // You get the phones by User.id, i thik so :-) 'users' is a first select and contains the id selected, and provide the find in phones.
    def user = User.get(params.users.toInteger())

    [phones: user.phones]
}

抱歉我的英语不好; - )