2013-12-18 82 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>