играть!рамки ENUM и Groovy проблема - PullRequest
4 голосов
/ 07 августа 2011

У меня есть что-то вроде следующего -

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 в БД, что в порядке. Но когда я перезагружаюсь / редактирую, тогда проблема поднимается. Потому что он использует ALIVE, DEAD и т. Д. В качестве значения для опций, поэтому не может правильно отображать список.

Есть ли понимание?

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Если я правильно понимаю ваш вопрос, вы хотите использовать 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, а если не найдено, по умолчанию используется enum toString

1 голос
/ 29 августа 2011

Чтобы добавить к предыдущему ответу, добавьте его в объявление Enum:

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

Обязательно используйте следующую декларацию:

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

Вы также можете добавить это в Enum:

    @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' /}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...