Как получить BaseModel или BeanModel из BeanModelMarker

Я следовал инструкциям:

  1. создать бин. Этот bean-компонент предназначен для перечисления, передаваемого с сервера на клиент с помощью RestyGWT.

    public enum Mode{
      MODIFY,
      EDIT,
      DELETE,
      CREATE
    }
    
  2. Определите маркер на бобе.

    @BEAN(Mode.class)
    static public class ModelMarker implements BeanModelMarker { }
    
  3. (Перефразируя заявление из блога GXT) Теперь используйте свой BeanModelMarker для любого компонента данных.

    Итак, я создал поле со списком.

    static private ComboBox<ModelMarker> propertyTypeComboBox =
      new ComboBox<ModelMarker>();
    

    К сожалению, ComboBox не принимает BeanModelMarker в качестве типа модели. И это, конечно, неправильно, потому что GWT еще не создан.

Итак, что мне делать с экземпляром, созданным GWT?

static ModelMarker beanModel =
  GWT.create(ModelMarker.class);

Я не могу найти какую-либо литературу, в которой бы мне прямо говорилось, что делать с BeanModelMarker после его определения. Как мне это использовать?

Я хотел бы знать, что мне нужно сделать, чтобы определить Bean или базовую модель, чтобы я мог использовать перечисление в моем поле со списком, управляемом данными.

Правильно ли я задаю вопрос о BeanModelMarker? Имеет ли это отношение к моей попытке создать поле со списком на основе перечисления?


person Blessed Geek    schedule 26.03.2012    source источник


Ответы (1)


Пара мыслей:

Вот обсуждение на форумах GXT о переносе типов enum в ComboBox. http://www.sencha.com/forum/showthread.php?67317-Enum-based-ComboBox. Используется несколько подходов - в этом потоке я выбрал подход создания EnumWrapper и некоторые статические удобные методы для создания коллекций List<EnumWrapper<MyEnum>> для передачи в поле со списком ListStore. Одна из основных причин, по которой я выбрал этот подход, а не подход BeanModel, заключалась в том, что мне нужно было, чтобы мои перечисления были совместимы с i18n, и я не хотел, чтобы эта логика i18n была в самом перечислении.

Что более актуально для вашего вопроса, правильный способ перевода объекта Java в BeanModel - использовать экземпляр BeanModelFactory, предоставленный из BeanModelLookup.getFactory(Mode.class). ModelMarker — это просто интерфейс, и он не может реализовать ModelData, поэтому ваше объявление ComboBox<ModelMarker> на самом деле не имеет смысла. Помните, что использование этого подхода означает, что ваше перечисление Mode должно предоставлять геттеры, чтобы код генерации BeanModel мог работать со своей магией отражения (как в http://www.sencha.com/forum/showthread.php?67317-Enum-based-ComboBox&p=332996&viewfull=1#post332996).

ComboBox<BeanModel> modeCombo = new ComboBox<BeanModel>();
ListStore<BeanModel> store = new ListStore<BeanModel>();

// this next line might need ModelMarker.class instead, its been a while
BeanModelFactory modeFactory = BeanModelLookup.get().getFactory(Mode.class);


// either add items one at a time
Mode mode = Mode.EDIT;
store.add(modeFactory.createModel(mode));

// or add a collection
store.add(modeFactory.createModel(Arrays.asList(Mode.values()));
person Colin Alworth    schedule 26.03.2012