如何修改传递给Grails GSP的属性值

时间:2015-03-05 15:24:48

标签: grails grails-2.0

我要求能够更改bean的值(属性) 传入gsp。我使用的是Grails 2.3.11。

请参阅下面的代码 - 这不会修改bean - 请告知如何完成它?

在第1行,这是尝试用新值替换属性 - 所以Venue - > Xenue。 在第2行,这表明该值没有改变。

// locns.gsp
<!DOCTYPE html>
<html >
    <head>
        ...
        <script type="text/javascript">
            <g:each in="${locns}" status="i" var="locn">
                var x = '${locn.addr1}'.replace("V", "X");
                locn.addr1 = x;                     #1
            </g:each>
        </script>   
    </head>
    <body>
        <g:each in="${locns}" status="i" var="locn">
            ${locn.addr1}                           #2
        </g:each>
    </body>
</html>

// Controller:
def locns() {
    Locn[] locns = new Locns[2];
    locns[0] = new Locn();
    ...     
    locns[0].addr1 = "Venue Point"; 
    locns[0].addr2 = 'London';
    ...
    [locns:locns]
}

// attribute / bean class   
class Locn {
    public String addr1;
    public String addr2;
    ...
}

谢谢你,史蒂夫。

2 个答案:

答案 0 :(得分:0)

您在这里混淆了客户端和服务器端逻辑。首先,GSP标签在服务器端执行以生成发送到浏览器的HTML,并且只有然后才能在客户端浏览器中执行生成的JavaScript。 GSP将生成一些类似于

的HTML
<!DOCTYPE html>
<html >
    <head>
        ...
        <script type="text/javascript">

                var x = 'Venue Point'.replace("V", "X");
                locn.addr1 = x;                     #1

                var x = 'Venue 2'.replace("V", "X");
                locn.addr1 = x;                     #1

        </script>   
    </head>
    <body>

            Venue Point                           #2

            Venue 2                           #2

    </body>
</html>

然后,JavaScript将在第一行#1处失败,因为您尝试在未定义的值上设置属性。

答案 1 :(得分:0)

你应该可以做这样的事情(即使它是劝阻,你的控制器应该处理这个)

at #1
<g:each in="${locns}" status="i" var="locn">
<% def locnChanged = new ArrayList<>() %>
<% def x = locn %>
<% x.locn = locn.addr.replace("V", "X") %>
<% locnChanged.add(x) %>
</g:each>

at #2
<g:each in="${locnChanged}" status="i" var="locn">
${locn.addr1}
</g:each>

那里不需要javascript。但是再一次,你不应该在GSP中照顾它。