我正在使用Grails 2.2.3和Fields插件1.3。 我想自定义字段以使用select标签管理一对多关系。
在views/_fields/oneToMany/_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
函数。
如何检索目标域类?
答案 0 :(得分:5)
只要您使用Map声明关系,例如:
static hasMany = [ books: Book ]
您可以获取引用域的列表,这是 bean 的hasMany
属性中的键,因此from
属性应更改为
from="${bean.hasMany[property].list()}"
或者,您可以将列表传递给_input.gsp
模板,前缀为input-
变量名称,例如
<f:field property="books" input-domainList="${bookInstaceList}" />
在_input.gsp
模板中,您可以按如下方式使用变量:
from="${domainList}"
或混合两种方法:
from"${domainList ?: bean.hasMany[property].list()}"
答案 1 :(得分:2)
我找到了解决问题的方法,此代码可以一对多和一对一正常工作
<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 Plugin的文档中发现,persistentProperty是类类型DomainProperty,但是它们的方法无效,并且我发现正确的类是org.grails.datastore.mapping.model.MappingFactory
答案 2 :(得分:0)
您可以在Set上使用.toArray()方法而不是.list()。
麦酒
答案 3 :(得分:0)
您可以使用以下代码来识别您的收藏元素
def className = bean.hasMany[property].properties.typeName
查看我的&#34; views / _fields / oneToMany / _input.gsp&#34;实现:
<%@ 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>