2013-09-17 5 views
0

Я пользователь Tapestry5, и у меня есть форма с полями gazillion, на которых все увеличивается с помощью числового.Зацикливание компонента текстового поля с динамическими свойствами объекта

пример

timesheet.tsHours01 timesheet.tsHours02 и т.д.

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

@Property 
private List<TimeSheetEntity> timeSheetEntity; 

@Property 
private List<TsWhour> tsWhours; 

@Property 
private TsWhour tsWhour; 

public void onPrepareFromForm() { 
    this.timeSheetEntity = timeSheetService.getCreateOrUpdate(timeSheetEntity); 

    tsWhours = new ArrayList<TsWhour>(); 
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours01")); 
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours02")); 
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours03")); 
} 

public class TsWhour { 

    private TimeSheetEntity timeSheetEntity; 
    private String id; 

    private BigDecimal property; 

    public TsWhour() { 
    } 

    public TsWhour(TimeSheetEntity timeSheetEntity, String id) { 
     this.timeSheetEntity = timeSheetEntity; 
     this.id = id; 
    } 

    public BigDecimal getProperty() { 
     try { 
      Method method = TimeSheetEntity.class.getMethod("get" + id);     
      return (BigDecimal) method.invoke(timeSheetEntity); 
     } catch (NoSuchMethodException ex) { 
      Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SecurityException ex) { 
      Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalArgumentException ex) { 
      Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InvocationTargetException ex) { 
      Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null;   
    } 

    public void setProperty(BigDecimal value) { 
     System.out.println(value); 
    } 

    public TimeSheetEntity getTimeSheetEntity() { 
     return timeSheetEntity; 
    } 

    public void setTimeSheetEntity(TimeSheetEntity timeSheetEntity) { 
     this.timeSheetEntity = timeSheetEntity; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

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

ответ

1

Ну, во-первых, вы можете использовать службу PropertyAccess как намного более простой способ получить свое динамически вычисленное свойство.

Что такое установка и изменение идентификатора? Является ли TsWhour компонентом?

В принципе, при оформлении формы, Гобелен должен будет восстановить свои шаги для каждого компонента и каждого изменения этого свойства id. Компонент Loop внутри формы знает, как это сделать (хотя вы можете настроить его для оптимизации вещей немного).

Вы не предоставили достаточно контекста.

Наконец, возможно, проблема с вашим моделированием данных, если у вас есть «gazillion» практически одинаковые поля. Возможно, то, что вам нужно, больше похоже на карту, чем на объект. Возможно, вам нужен простой способ извлечения данных из вашего типа сущности (я предполагаю, что вы используете Hibernate или JPA) в промежуточном типе, с которым легче работать с уровнем пользовательского интерфейса.

+0

Привет, Говард, я строю временной лист с текстовыми полями, который охватывает более 14 дней, но затем имеет много строк, которые управляют часами работы, больными, людьми, каникулами и т. Д. Во всяком случае TimeSheetEntity является объектом спящего режима, а TsWhour ничто иное, как внутренний класс, используемый в качестве эксперимента для получения этой работы. TsWhours01 означает расписание рабочего дня 1 день. TsWhours01 на самом деле является свойством в моем TimeSheetEntity или столбце в базе данных, который проходит через TsWhours14. Я надеялся объединить свойства в интерфейсе, а не жестко кодировать их. Я получил идентификатор от имени свойства. –

+0

Есть ли примеры использования службы PropertyAccess? –

+0

Просто взгляните на [javadoc] (http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/PropertyAccess.html), @Inject PropertyAccess и выходите! –

0

Если, как предложил Говард, вы хотите использовать java.util.Map в качестве промежуточного объекта, вы можете использовать префикс привязки map: от гобелена. Demo here

Смежные вопросы