Grails字段插件:为一对多关系选择标记
我正在使用Grails2.2.3和Fields插件1.3。 我想使用select标记自定义字段以管理一对多关系 在Grails字段插件:为一对多关系选择标记,grails,Grails,我正在使用Grails2.2.3和Fields插件1.3。 我想使用select标记自定义字段以管理一对多关系 在views/\u fields/oneToMany/\u input.gsp中,我有: <g:select name="${property}.id" from="${type.list()}" optionKey="id" value="${value}" class="form-control one-to-many" noSelection="['null': "${la
views/\u fields/oneToMany/\u input.gsp
中,我有:
<g:select name="${property}.id" from="${type.list()}" optionKey="id" value="${value}" class="form-control one-to-many" noSelection="['null': "${label}"]" />
但是type
是一个集合,所以我不能使用list
函数
如何检索目标域类?您可以在集合中使用.toArray()方法,而不是.list()
ale只要您使用映射来声明关系,例如:
static hasMany = [ books: Book ]
您可以从bean的hasMany
属性中获取引用域的列表,这是键,因此from
属性应该更改为
from="${bean.hasMany[property].list()}"
或者,您可以将列表传递给\u input.gsp
模板,在变量名称前面加上input-
,例如
<f:field property="books" input-domainList="${bookInstaceList}" />
或混合两种方法:
from"${domainList ?: bean.hasMany[property].list()}"
您可以使用下面的代码来标识集合的元素
def className = bean.hasMany[property].properties.typeName
请参阅我的“views/_fields/oneToMany/_input.gsp”实现:
<%@ page defaultCodec="html" %>
<%
def className = bean.hasMany[property].properties.typeName
def simpleName = Class.forName(className).simpleName
def beanSimpleName = bean.class.simpleName
def createUri = "/${simpleName.toLowerCase()}/create?${beanSimpleName.toLowerCase()}.id=${bean.id}"
%>
<a id="add${simpleName}" name="add${simpleName}" href="${createLink(uri: "${createUri}")}">
Add ${simpleName}
</a>
<ul>
<g:each var="item" in="${value}">
<li>
<a href="${createLink(uri: "/${simpleName.toLowerCase()}/show/${item.id}")}">${item}</a>
</li>
</g:each>
</ul>
-
我找到了这个问题的解决方案,这段代码在一对多和一对一的情况下运行良好
<div class="input-group">
<g:select name="${persistentProperty.toString().contains('one-to-many')?property:property+'.id'}" value="${value?.id}" required="${required}"
noSelection="${['null':'Escriba...']}" class="select2 col-md-6"
multiple="${persistentProperty.toString().contains('one-to-many')?true:false}" from="${grailsApplication.getDomainClass(persistentProperty.properties['associatedEntity'].toString()).clazz.list()}"
optionKey="id"></g:select>
</div>
此解决方案可能会有所帮助。我在Fields插件的文档中发现,persistentProperty是一个类类型的DomainProperty,但它们的方法不起作用,我发现正确的类是org.grails.datastore.mapping.model.MappingFactory谢谢,但是Set没有数组函数。我不能同时使用toList:在create表单中,集合是空的。我必须使用目标域控制器列表函数。如中所示,Set有一个.toArray()方法。但是,在使用模型-视图-控制器模式时,您不希望视图了解有关控制器的任何信息。控制器的工作是将模型提供给视图。在控制器的创建操作中,您可以加载列表并将其粘贴到作为参数的视图中。您是对的:toArray存在,但我不能在空对象上执行(当我创建新对象时)。我只想知道控制器名称:
.list()
也是Grails脚手架管理选择字段的方式。太棒了!工作起来很有魅力!:)类似“输入-…”的参数最近更改为“小部件-…”
<div class="input-group">
<g:select name="${persistentProperty.toString().contains('one-to-many')?property:property+'.id'}" value="${value?.id}" required="${required}"
noSelection="${['null':'Escriba...']}" class="select2 col-md-6"
multiple="${persistentProperty.toString().contains('one-to-many')?true:false}" from="${grailsApplication.getDomainClass(persistentProperty.properties['associatedEntity'].toString()).clazz.list()}"
optionKey="id"></g:select>
</div>