【问题标题】:Grails: Invoking Domain method from gspGrails:从 gsp 调用域方法
【发布时间】:2015-11-04 19:59:09
【问题描述】:

我有以下域类:

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 中,我试图在选择下拉列表中显示状态列表

<g:select name="location.state" class="form-control" from="${com.example.Location?.getStatesList()}" value="${itemInstance?.location?.state}" noSelection="['': '']" />

这样做时,我收到“缺少方法异常”

如果我用列表更改方法,我不再收到错误,但我不希望这样。

from="${com.example.Location?.list()}"    // works
from="${com.example.Location?.getStatesList()}"     // does not work

非常感谢任何帮助。

【问题讨论】:

  • getStatesList() 应以您尝试使用的方式声明为static

标签: grails gsp


【解决方案1】:

正如 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.statesListLocation.getStatesList()

另类

我认为更简洁的替代方法是使用 final 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。不同之处在于全大写名称意味着一个不会更改的值(并且不需要访问数据库)。

【讨论】:

    【解决方案2】:

    list() 是域对象元类的方法。为了做你想做的事情,你必须实例化一个 Location 实例(或添加到元类)。如果我是你,我会亲自使用Enum

    【讨论】:

      【解决方案3】:

      您必须将getStatesList() 设为静态,因为您没有访问Location 类的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        相关资源
        最近更新 更多