2013-12-18 34 views
3

我使用的是Grails 2.2.3和Fields插件1.3。 我想定制字段以使用选择标签管理一对多关系。Grails字段插件:为一对多关系选择标签

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功能。

如何检索目标域类?

回答

5

只要您使用Map申报的关系,例如:

static hasMany = [ books: Book ] 

您可以在提到域的名单,这是从的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()}" 
+0

太棒了!奇迹般有效! :) –

+1

“input -...”类似params最近更改为“widget -...” –

0

你可以在你的Set上使用.toArray()方法而不是.list()。

强麦

+0

谢谢你,但集并没有指定者功能。而且我也不能使用toList:在创建表单中这个集合是空的。我必须使用目标域控制器列表功能。 –

+0

正如你可以在[java 6 docs](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html)中看到的那样,Set有一个.toArray()方法。但是,使用模型 - 视图 - 控制器模式时,您不希望视图知道有关控制器的任何信息。控制器的工作是将模型提供给视图。在您的控制器的创建动作中,您可以加载列表并粘贴以查看参数。 – alessandro

+0

你说得对:toArray存在,但我不能执行一个空对象(当我创建一个新的对象)。 我只想知道控制器名称:' .list()'也是Grails脚手架管理选择字段的方式。 –

0

您可以使用下面的代码来识别的元素你收藏

def className = bean.hasMany[property].properties.typeName 

见我 “的意见/ _fields /一对多/ _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>