1

我需要以编程方式加载列表。代替:

<g:select 
       name="cars" 
       from="${Car.list()}" 
       value="${person?.cars*.id}" 
       optionKey="id"
       multiple="true" />

我想这样做是因为,列表并不总是来自同一个来源

g.select(name : searchfield.fieldName,                          
         class : "fillWidth searchfield",
         multiple : "true",
         from : ${ searchfield.fieldFrom },
         optionKey : searchfield.fieldKey,
         optionValue : searchfield.fieldValue)

从不加载。使用列表,我收到一条错误消息:

方法没有签名:sample.SearchTagLib.$() 适用于参数类型:(sample.SearchTagLib$_getSelectField_closure5) 值:[sample.SearchTagLib$_getSelectField_closure5@1187b50] 可能的解决方案:is(java.lang.Object), any( )、使用([Ljava.lang.Object;)、任何(groovy.lang.Closure)、wait()、grep()

4

2 回答 2

1

您不需要选项${}中的from

g.select(name : searchfield.fieldName,                          
         class : "fillWidth searchfield",
         multiple : "true",
         from : searchfield.fieldFrom,
         optionKey : searchfield.fieldKey,
         optionValue : searchfield.fieldValue)

在 Groovy 代码${}中,一种将 Groovy 表达式放在双引号 GString 中的方法,如果您不在 GString 中,则可以直接使用表达式而不将其包装在${}.


从您的评论中编辑

此时的 fieldFrom 是一个字符串,它将从数据库中获取其值。因此数据库中的值是“Car.list()”,在原型中我需要将其转换为可绑定或可执行的代码行。

通常不建议允许您的应用程序执行用户提供的任意 Groovy 代码片段(出于明显的安全原因)。只要代码片段来自安全来源,例如受信任的管理员用户,那么就足够公平,就可以使用GroovyShell

def from = new GroovyShell().evaluate(searchfield.fieldFrom)

但这可能效率很低,每次都创建一个新的类加载器并解析和编译整个 Groovy 脚本类。如果这些fieldFrom值旨在始终从数据库中提取某些内容(即它们总是类似于Car.list()or Vehicle.findAllByNumberOfWheelsGreaterThan(2),而不是任意的 Groovy like [1,2,3]),那么最好将 HQL 表达式存储在fieldFrom其中并使用它们运行它们executeQuery

def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)

executeQuery是一个静态的 GORM 方法,您需要在特定的域类上调用它,但它可以返回任何类型的结果)。HQL 的等价物Car.list()是“ from Car”,的等价物Vehicle.findAllByNumberOfWheelsGreaterThan(2)是“ from Vehicle where numberOfWheels > 2”,等等。

于 2013-08-02T16:39:56.397 回答
1

我认为您需要使用字符串作为属性名称:

g.select('name' : searchfield.fieldName,                          
         'class' : "fillWidth searchfield",
         'multiple' : "true",
         'from' : ${ searchfield.fieldFrom },
         'optionKey' : searchfield.fieldKey,
         'optionValue' : searchfield.fieldValue)
于 2013-08-02T16:37:42.230 回答