Grails字段插件:为一对多关系选择标记

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

我正在使用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': "${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>