如何将多个枚举字段添加到 Grails 4 中的创建和编辑表单?
How to add a multiple enum field to the create and edit forms in Grails 4?
在我的域模型中,一些 类 将枚举集合作为字段。我以两种不同的方式将其建模为嵌入式集合:
class A {
String name
Set<Enumeration> enumerations
static embedded = ['enumerations']
}
enum Enumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
也作为 hasMany 集合:
class A {
String name
static hasMany = [enumerations:Enumeration]
}
enum Enumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
在这两种情况下,我都可以通过以下方式将枚举值添加到 BootStrap.groovy 中的集合:
A.withTransaction { status ->
def a1 = new A( name:"a1" )
a1.addToEnumerations( Enumeration.ENUM_VALUE_1 )
a1.addToEnumerations( Enumeration.ENUM_VALUE_2 )
}
使用脚手架,我可以在index和show页面看到枚举集合的内容,但是在编辑和创建页面,只显示标签,不显示小部件。
这是显示小部件的最简单方法,例如多个 select,对于 Grails 4 中的此类字段(我使用的是 Grails 4.0.3)?
提前致谢。
Which is the simplest way to show a widget, e.g. a multiple select,
for this kind of fields in Grails 4 (I am using Grails 4.0.3)?
您可以使用 select
标签。
<g:select multiple="true" name="someName" from="${somePackage.SomeEnumClassName}"/>
这是我在@jeff-scott-brown 回答后遵循的过程:
- 我为 class A 生成了视图:
generate-views A
- 然后在
grails-app/views/a/edit.gsp
和grails-app/views/a/create.gsp
我改变了这个元素:
<f:all bean="a"/>
进入这些其他元素:
<f:with bean="a">
<f:field property="name"/>
<f:field property="enumerations">
<g:select
multiple="true"
name="${property}"
from="${Enumeration}"
value="${a?.enumerations}"
/>
</f:field>
</f:with>
它适用于 embedded 和 hasMany 方法。
这不应该是 Grails 中枚举集合的默认脚手架吗?
好吧,如果这是为了验证您的数据库的数据,您可以在您的域上使用 'inList' 约束作为相同的约束,方法是将其提取为 'List' 供您使用:
def class = grailsApplication.getDomainClass(className)
def props = class.getConstrainedProperties()
props.each(){ k,v ->
if(k=='theColumnName-you-are-trying-to-get'){
return v.getInList()
}
}
这是一个更简单的解决方案,无需生成视图,即无需修改 edit.gsp
和 create.gsp
。只需按照@jeff-scott-brown 的建议使用 fields 插件。
假设这是您的域 class:
package mypackage
class MyClass {
// ...
// properties
// ...
Set<MyEnumeration> enumerations
// no need to declare it as embedded
// static embedded = ['enumerations']
}
enum MyEnumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
并且您已经为它生成了脚手架控制器,即
package mypackage
class MyClassController {
static scaffold = MyClass
}
您唯一需要做的就是创建包含以下内容的文件 grails-app/views/_fields/myClass/enumerations/_widget.gsp
:
<g:select
multiple="true"
name="${property}"
from="${mypackage.MyEnumeration}"
value="${myClass?.enumerations}"
/>
如果您将枚举集合声明为 hasMany
关联,它也有效,即
package mypackage
class MyClass {
// ...
// properties
// ...
static hasMany = [enumerations:MyEnumeration]
}
enum MyEnumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
在我的域模型中,一些 类 将枚举集合作为字段。我以两种不同的方式将其建模为嵌入式集合:
class A {
String name
Set<Enumeration> enumerations
static embedded = ['enumerations']
}
enum Enumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
也作为 hasMany 集合:
class A {
String name
static hasMany = [enumerations:Enumeration]
}
enum Enumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
在这两种情况下,我都可以通过以下方式将枚举值添加到 BootStrap.groovy 中的集合:
A.withTransaction { status ->
def a1 = new A( name:"a1" )
a1.addToEnumerations( Enumeration.ENUM_VALUE_1 )
a1.addToEnumerations( Enumeration.ENUM_VALUE_2 )
}
使用脚手架,我可以在index和show页面看到枚举集合的内容,但是在编辑和创建页面,只显示标签,不显示小部件。
这是显示小部件的最简单方法,例如多个 select,对于 Grails 4 中的此类字段(我使用的是 Grails 4.0.3)?
提前致谢。
Which is the simplest way to show a widget, e.g. a multiple select, for this kind of fields in Grails 4 (I am using Grails 4.0.3)?
您可以使用 select
标签。
<g:select multiple="true" name="someName" from="${somePackage.SomeEnumClassName}"/>
这是我在@jeff-scott-brown 回答后遵循的过程:
- 我为 class A 生成了视图:
generate-views A
- 然后在
grails-app/views/a/edit.gsp
和grails-app/views/a/create.gsp
我改变了这个元素:
<f:all bean="a"/>
进入这些其他元素:
<f:with bean="a">
<f:field property="name"/>
<f:field property="enumerations">
<g:select
multiple="true"
name="${property}"
from="${Enumeration}"
value="${a?.enumerations}"
/>
</f:field>
</f:with>
它适用于 embedded 和 hasMany 方法。
这不应该是 Grails 中枚举集合的默认脚手架吗?
好吧,如果这是为了验证您的数据库的数据,您可以在您的域上使用 'inList' 约束作为相同的约束,方法是将其提取为 'List' 供您使用:
def class = grailsApplication.getDomainClass(className)
def props = class.getConstrainedProperties()
props.each(){ k,v ->
if(k=='theColumnName-you-are-trying-to-get'){
return v.getInList()
}
}
这是一个更简单的解决方案,无需生成视图,即无需修改 edit.gsp
和 create.gsp
。只需按照@jeff-scott-brown 的建议使用 fields 插件。
假设这是您的域 class:
package mypackage
class MyClass {
// ...
// properties
// ...
Set<MyEnumeration> enumerations
// no need to declare it as embedded
// static embedded = ['enumerations']
}
enum MyEnumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}
并且您已经为它生成了脚手架控制器,即
package mypackage
class MyClassController {
static scaffold = MyClass
}
您唯一需要做的就是创建包含以下内容的文件 grails-app/views/_fields/myClass/enumerations/_widget.gsp
:
<g:select
multiple="true"
name="${property}"
from="${mypackage.MyEnumeration}"
value="${myClass?.enumerations}"
/>
如果您将枚举集合声明为 hasMany
关联,它也有效,即
package mypackage
class MyClass {
// ...
// properties
// ...
static hasMany = [enumerations:MyEnumeration]
}
enum MyEnumeration {
ENUM_VALUE_1,
ENUM_VALUE_2,
ENUM_VALUE_3
}