Grails 3索引视图列限制问题:Fields插件与respond方法困扰
解决Grails Fields插件中HasMany关联列表杂乱的问题
哈哈,太懂这种时隔多年回归Grails,刚上手新特性就踩小坑的感觉!你说的这个hasMany关联在索引页显示一堆子对象链接的问题,我之前也遇到过,给你几个不用动全局模板的灵活解法:
1. 针对单个领域类局部覆盖模板(最直观)
不用改全局的_table.gsp,咱们给目标领域类单独定制模板就行:
- 在
grails-app/views/[你的领域类小写名]/目录下新建_table.gsp(比如你的类是Book,就建grails-app/views/book/_table.gsp) - 把全局模板(一般在
grails-app/views/templates/fields/_table.gsp)的内容复制过来 - 找到渲染hasMany关联的那一行代码(大概是
<f:property property="${association}" />之类的),直接删掉或者注释掉
这样只有这个领域类的索引页会用这个定制模板,其他类完全不受影响。
2. 在视图里直接指定要显示的字段(最灵活)
如果不想复制模板,直接在索引页(比如index.gsp)里调用Fields的table标签时,明确指定要渲染的字段就行:
<f:table domainClass="com.yourpackage.YourDomain" fields="['id', 'name', 'dateCreated', 'lastUpdated']"/>
这样插件只会渲染你列出来的字段,自动忽略hasMany的关联列,完美解决杂乱问题。
3. 在领域类里配置默认列表字段(一劳永逸)
要是这个领域类所有列表页都不想显示hasMany关联,直接在领域类里加个静态配置:
class YourDomain { // ... 你的属性和关联定义 static List<String> defaultListFields = ['id', 'name', 'dateCreated'] }
Fields插件会自动识别这个配置,默认用这些字段渲染列表,不用每次都在视图里指定。
另外你提到想在控制器里用list方法处理,其实也可以手动构造要返回的数据,比如:
def index() { def domainList = YourDomain.list(params).collect { domain -> [ id: domain.id, name: domain.name, dateCreated: domain.dateCreated // 只保留你需要的字段,不包含hasMany的关联 ] } respond domainList, model: [yourDomainCount: YourDomain.count()] }
不过这种方法需要手动映射字段,不如前面几种插件原生的方法方便,除非你有更复杂的业务逻辑要处理。
内容的提问来源于stack exchange,提问作者Bill Hutchinson
相关产品推荐
相关产品推荐

