【问题标题】:Referencing a Groovy Map using a variable inside a GSP expression使用 GSP 表达式中的变量引用 Groovy Map
【发布时间】:2011-04-29 22:47:59
【问题描述】:

我试图在我的 Grails 应用程序中减少一些重复的 GSP 代码。以下代码按预期工作:

<g:textField name="recordValues.0.name" value="${recordValues?.get(0)?.name}"/>
<g:textField name="recordValues.0.age" value="${recordValues?.get(0)?.age}"/>

[edit]recordValues.0.age 实际上是 Map 而不是类属性,正如我最初所说的那样。

但是,当我尝试使用 list 枚举动态设置其中的一堆时,不会评估 value 属性:

<g:each in="${fields}" var="prop">
  <g:textField name="recordValues.0.${prop}" value="${recordValues?.get(0)?.prop}"/>
</g:each>

似乎 value 属性正在寻找名为“prop”的 property 映射键,并且没有将其评估为变量。我试过recordValues?.get(0)[prop]? 之间没有,但它没有编译。

是否有一些动态方法可以使用变量作为参数或更简单的解决方案来调用?

【问题讨论】:

  • 为什么要引用列表中的第一项。你的重复GSP代码是不是迭代错误造成的?我会使用 来遍历您的 recordValues 并声明有问题的字段,如您的第一个示例所示。
  • 它仍处于开发的早期阶段,“列表中的第一项”在此迭代中被硬编码,但我们预计最终每页会有多个记录值。实际的字段名称未在域对象中编码 - 有一个通用字段实体,GSP 实际上是设置每个字段实例的名称。直到数据被保存,我才能迭代它们。所以我目前的重构是从枚举中指定字段名称(不是我在 Q 中所说的列表)。我没有编写第一个版本,所以我仍在尝试了解所有代码(和 Grails)

标签: grails groovy gsp


【解决方案1】:

最后自己整理了。感谢代码空间让我再次检查代码并注意到它是我试图引用的地图,而不是对象属性。我使用枚举的事实混淆了这个问题,因为使用常规 map.get(var) 不起作用,我需要 map.get(var.name()) 代替(也许我会将它编码为枚举内的字符串字段以避免这种情况)。

解决办法如下:

<g:each in="${fields}" var="prop">
  <g:textField name="recordValues.0.${prop}" value="${recordValues?.get(0)?.get(prop.name())}"/>
</g:each>

【讨论】:

  • 感谢 Victor,它就像 ${recordValues?.get(0)?.(prop.name())} - 另一个很酷的 Groovy 快捷方式要记住 :-)
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多