java - ¡jugar! marco ENUM y Groovy problema
templates enums (2)
Si entiendo correctamente su pregunta, quiere usar valueProperty
y labelProperty
para establecer los valores adecuados en la option
. Algo como:
#{select "autoCreateEvent", items:models.Woman.Outcome.values(), valueProperty:''ordinal'', labelProperty: ''name'', id:''autoCreateEvent'' /}
EDITAR:
Para que esto funcione, tendrás que modificar un poco la enumeración, así:
public enum Outcome {
A,B;
public int getOrdinal() {
return ordinal();
}
}
La razón es que Play # {select} espera getters en los valueProperty
y labelProperty
, y cuando no se encuentra de manera predeterminada en la enumeración toString
Tengo algo como lo siguiente-
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'' /}
Guarda el valor ENUM en DB, lo cual está bien. Pero cuando recargo / edito, el problema aumenta. Porque usa ALIVE, DEAD, etc. como valor para las opciones, por lo que no puede mostrar la lista correctamente.
¿Alguna idea?
Para agregar a la respuesta anterior, agréguela a su declaración Enum:
public String getLabel() {
return play.i18n.Messages.get(name());
}
Asegúrese de usar la siguiente declaración:
#{select "[field]", items:models.[Enum].values(), valueProperty:''name'', labelProperty: ''label'' /}
También puede agregar esto en el Enum:
@Override
public String toString() {
return getLabel();
}
Lo cual será útil si desea mostrar el valor internacionalizado en su archivo de vista (ya que se llama a toString automáticamente cuando se muestra) pero function name () usa toString () por lo que deberá vincular valueProperty a otra función, como se muestra a continuación:
public String getLabel(){
return toString();
}
public String getKey() {
return super.toString();
}
@Override
public String toString() {
return Messages.get(name());
}
Y el uso de #select:
#{select "[field]", items:models.[Enum].values(), value:flash.[field], valueProperty:''key'', labelProperty: ''label'' /}