我正在猛烈抨击我认为在Grails中解决的一个非常简单的问题:
说我有购物车般的模型; 所以一个类Cart有多个项目,每个项目都属于购物车.一般来说,我不关心购物车中物品的顺序 - 我不关心它们存储在哪个顺序,计算等等.但是,我确实想以相同的顺序显示它们.在我看来,这个逻辑应该能够在视图层中完整地存在,但是我能够找到的唯一解决方案告诉我将项目声明为模型层中的SortedSet.这也会影响我的控制器层,因为简单的List操作(如.collect {}现在需要额外的语法跳转以保持类型转换正确并保留我的排序.
对我来说,这是坚果,所以我必须错过一些简单的东西!有没有办法,例如,做类似的东西<g:each in="${cart.items.sort{it.name}}">或类似的东西,这样我只能在输出/视图层强制执行一致的显示顺序?编辑 - 见Matt的答案如下; 这个版本确实有效.
感谢您的任何建议或指示!
Mat*_*man 23
您还可以使用此处定义的集合/映射可用的排序方法:http://groovy.codehaus.org/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html
我个人发现在我的GSP中与<g:each />标签一起使用它很容易:
<!-- Books sorted by title -->
<g:each in="${ books.sort{a,b-> a.title.compareTo(b.title)} }">
<p>Title: ${it.title}</p>
<p>Author: ${it.author}</p>
</g:each>
Run Code Online (Sandbox Code Playgroud)
这个第 3 方标签看起来可以满足您的需要。如果没有,您随时可以制作自己的标签。Tag 类可以像这样进行排序
class SortTagLib {
static namespace = 'sort'
def sort = { attrs ->
// A closure that does the sorting can be passed as an attribute to the tag.
// If it is not provided the default sort order is used instead
def sorter = attrs.sorter ?: {item1, item2 -> item1 <=> item2}
sorter = sorter as Comparator
// The collection to be sorted should be passed into the tag as a parameter
Collections.sort(attrs.items, sorter)
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以使用此标记按对象的名称属性对对象集合进行排序,如下所示:
<sort:sort items="someCollection" sorter="${someComparatorClosure}"/>
Run Code Online (Sandbox Code Playgroud)
当执行标签时,所引用的集合someCollection将就地排序。