玩! 框架ENUM和Groovy问题
我有类似以下的东西 –
Woman.java
... @Entity public class Woman extends Model { public static enum Outcome { ALIVE, DEAD, STILL_BIRTH, LIVE_BIRTH, REGISTER } ... }
File.java
... @Entity public class Form extends Model { ... public Outcome autoCreateEvent; ... }
create.html上
#{select "autoCreateEvent", items:models.Woman.Outcome.values(), id:'autoCreateEvent' /}
它将ENUM值保存在DB中,这是可以的。 但是,当我重新加载/编辑时,问题就出现了。 因为它使用ALIVE,DEAD等作为选项的值,所以它无法正确显示列表。
任何洞察力?
如果我正确理解你的问题,你想使用valueProperty
和labelProperty
在option
设置正确的值。 就像是:
#{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}期望在valueProperty
和labelProperty
params中valueProperty
getter,而在找不到时默认为enum toString
要添加到上一个答案,请将其添加到您的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' /}