是否有Grails / Groovy方法从列表中提取子列表?

时间:2014-11-10 16:45:12

标签: grails model-view-controller groovy

我的模特:

class Fizz {
    String bimder
    Buzz buzz
}

class Buzz {
    int bupo
}

在我的控制器中,我正在维护Fizz个实例的列表:

class MyController {
    static List<Fizz> fizzes = []

    def index() {
        render(view: "display_buzzes", model: fizzes)
    }
}

在我的display_buzzes.gsp

<!--
    Here I want to iterate through all the fizzes, extract their buzz
    instance, and inject that buzz into a list to display as an option
    inside this select.
-->
<g:select name="buzzes" from="${???}" />

因此,在<select>内,我希望Grails以某种方式从Buzz列表中提取fizzes个实例的“子列表”,并显示嗡嗡声。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

from="${fizzes*.buzz}"

应该这样做。

但是(与实际问题无关)你设置控制器的方式很容易出错。

默认情况下,控制器是单例(在较新版本的Grails中),所以

static List<Fizz> fizzes = []

将始终保持跨请求的状态。如果那是你不想要的,那么在action方法中获取Fizz。例如:

class MyController {
    def index() {
        List<Fizz> fizzes = Fizz.all
        render( view: "display_buzzes", model: [fizzes: fizzes] )
    }
}

答案 1 :(得分:0)

解决问题的关键是使用collect来收集Buzz个实例的列表。这是一个简单的Groovy示例,说明它是如何使用的:

​class Fizz {
  String bimder
  Buzz buzz
}  
class Buzz { 
  int bupo 
}

List<Fizz> fizzes = [
  new Fizz(bimder: '1', buzz: new Buzz(bupo: 1)), ​​​
  new Fizz(bimder: '2', buzz: new Buzz(bupo: 2)),
  new Fizz(bimder: '3', buzz: new Buzz(bupo: 3)),
  new Fizz(bimder: '4', buzz: new Buzz(bupo: 4))
]

println ​fizzes.collect{it.buzz}​

现在,您需要使用以下内容<g:select>

<g:select name="buzzes" from="${fizzes.collect{it.buzz}}" />

以上内容将为您提供从您的Fizzes列表中收集的嗡嗡声列表。享受!