Grails:从 gsp 调用域方法
Grails: Invoking Domain method from gsp
我有以下域 class:
package com.example
class Location {
String state
def getStatesList(){
def states = ['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
return states
}
}
在我的 gsp 中,我试图在 select 下拉列表中显示状态列表
<g:select name="location.state" class="form-control" from="${com.example.Location?.getStatesList()}" value="${itemInstance?.location?.state}" noSelection="['': '']" />
这样做,我收到 "missing method exception"
如果我用列表更改方法,我就不会再收到错误,但我不想那样。
from="${com.example.Location?.list()}" // works
from="${com.example.Location?.getStatesList()}" // does not work
非常感谢任何帮助。
list() 是域对象的元类上的一个方法。为了做你想做的事,你必须实例化 Location 的一个实例(或添加到元类)。如果我是你,我个人会使用 Enum。
您必须将 getStatesList()
设为静态,因为您没有访问 Location
class.
的实例
正如 dmahaptro 所说,您可以通过将 getStatesList()
设为静态方法来纠正此问题。
class Location {
String state
static List<String> getStatesList() {
['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
}
}
然后你就可以执行Location.statesList
或Location.getStatesList()
.
备选
我认为更简洁的替代方法是使用最终的 constant:
class Location {
String state
static final List<String> STATES =
['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
}
然后您可以通过相同的方式访问列表:Location.STATES
。不同之处在于全大写名称表示一个不会更改的值(并且不需要访问数据库)。
我有以下域 class:
package com.example
class Location {
String state
def getStatesList(){
def states = ['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
return states
}
}
在我的 gsp 中,我试图在 select 下拉列表中显示状态列表
<g:select name="location.state" class="form-control" from="${com.example.Location?.getStatesList()}" value="${itemInstance?.location?.state}" noSelection="['': '']" />
这样做,我收到 "missing method exception"
如果我用列表更改方法,我就不会再收到错误,但我不想那样。
from="${com.example.Location?.list()}" // works
from="${com.example.Location?.getStatesList()}" // does not work
非常感谢任何帮助。
list() 是域对象的元类上的一个方法。为了做你想做的事,你必须实例化 Location 的一个实例(或添加到元类)。如果我是你,我个人会使用 Enum。
您必须将 getStatesList()
设为静态,因为您没有访问 Location
class.
正如 dmahaptro 所说,您可以通过将 getStatesList()
设为静态方法来纠正此问题。
class Location {
String state
static List<String> getStatesList() {
['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
}
}
然后你就可以执行Location.statesList
或Location.getStatesList()
.
备选
我认为更简洁的替代方法是使用最终的 constant:
class Location {
String state
static final List<String> STATES =
['AL','AK','AZ','AR','CA','CO','CT',
'DC','DE','FL','GA','HI','ID','IL','IN','IA',
'KS','KY','LA','ME','MD','MA','MI','MN','MS',
'MO','MT','NE','NV','NH','NJ','NM','NY','NC',
'ND','OH','OK','OR','PA','RI','SC','SD','TN',
'TX','UT','VT','VA','WA','WV','WI','WY']
}
然后您可以通过相同的方式访问列表:Location.STATES
。不同之处在于全大写名称表示一个不会更改的值(并且不需要访问数据库)。