我要求能够更改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;
...
}
谢谢你,史蒂夫。
答案 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中照顾它。