【问题标题】:play! framework ENUM and Groovy problem玩!框架 ENUM 和 Groovy 问题
【发布时间】:2011-08-07 16:28:50
【问题描述】:

我有类似以下的东西-

Woman.java

...
@Entity
public class Woman extends Model {

    public static enum Outcome {
        ALIVE, DEAD, STILL_BIRTH, LIVE_BIRTH, REGISTER
    }
    ...
}

文件.java

...
@Entity
public class Form extends Model {
    ...
    public Outcome autoCreateEvent;
    ...
}

创建.html

#{select "autoCreateEvent", items:models.Woman.Outcome.values(), id:'autoCreateEvent' /}

它将 ENUM 值保存在 DB 中,这没关系。但是,当我重新加载/编辑时,问题就出现了。因为它使用 ALIVE、DEAD 等作为选项的值,所以无法正确显示列表。

有什么见解吗?

【问题讨论】:

    标签: java templates groovy enums playframework


    【解决方案1】:

    如果我正确理解您的问题,您想使用valuePropertylabelPropertyoption 中设置正确的值。比如:

    #{select "autoCreateEvent", items:models.Woman.Outcome.values(), valueProperty:'ordinal', labelProperty: 'name', id:'autoCreateEvent' /}
    

    编辑:

    为此,您需要稍微调整枚举,如下所示:

    public enum Outcome {
      A,B;
    
      public int getOrdinal() {
         return ordinal();
      }
    
    }
    

    原因是 Play #{select} 期望在 valuePropertylabelProperty 参数中使用 getter,如果未找到则默认为枚举 toString

    【讨论】:

    • 您好,感谢您的回复,我认为它应该可以工作,但它没有。你能去这个链接搜索'valueProperty'吗,他们评论了那部分-svn.codehaus.org/grails-plugins/grails-filterpane/tags/…
    • @rifat 您提供了 grails 的链接,而不是 play 框架...您遇到什么错误?
    • 没有错误!但它给出了错误的输出 而我期望
    • 虽然我还是有麻烦,但你说的没问题:)
    【解决方案2】:

    要添加到之前的答案,请将其添加到您的 Enum 声明中:

    public String getLabel() {
        return play.i18n.Messages.get(name());
    }
    

    确保使用以下声明:

    #{select "[field]", items:models.[Enum].values(), valueProperty:'name', labelProperty: 'label' /}
    

    你也可以在枚举中添加这个:

        @Override
    public String toString() {
        return getLabel();
    }
    

    如果您想在视图文件中显示国际化的值(因为显示时会自动调用 toString),但函数 name() 使用 toString(),因此您必须将 valueProperty 绑定到另一个函数,这将很有用,如关注:

    public String getLabel(){
        return toString();
    }
    
    public String getKey() {
        return super.toString();
    }
    
    @Override
    public String toString() {
        return Messages.get(name());
    }
    

    而#select 使用:

    #{select "[field]", items:models.[Enum].values(), value:flash.[field], valueProperty:'key', labelProperty: 'label' /}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2012-06-22
      相关资源
      最近更新 更多