2012-05-26 5 views
5

для простоты:Как отредактировать набор <? расширяет EntityProxy> с помощью редактора GWT?

public class Person 
{ 
    String name; 
    Set<Address> addresses; 
} 

public class Address 
{ 
    String city; 
    String street; 
} 

с и соответствие

public interface PersonProxy extends EntityProxy 
{ 
    public String getName(); 
    public Set<AdressProxy> getAddresses(); 
} 

и

public interface AdressProxy extends EntityProxy 
{ 
    public String getCity(); 
    public String getStreet(); 
} 

я получил классы UiBuinder редактировать AddressProxy и мне ясно, как использовать ListEditor в Если я получил список, но данные заданы в классе Person , как я могу использовать редактор Framework для их редактирования? Или может быть, как мне конвертировать Set to List, когда он становится PersonProxy?

Я сделал попытку поставить своего рода адаптер класса редактора, который будет осуществлять

LeafValueEditor<Set<AddressProxy>> 

, а затем внутри LeafValueEditor.setValue(), перемещаются в список и начать новую driver.edit() на отдельную иерархию Editor, которая занимается редактированием списка, но с удачей.

ответ

6

Вы должны создать CompositeEditor<Set<AddressProxy>, AddressProxy, AddressEditor>, аналогичный ListEditor, но с Set вместо List. Предположим, вы могли бы как-то делегировать ListEditor, хотя я действительно не уверен.

+0

Спасибо! Это с чего начать. Честно говоря, ленивый я надеялся на ссылку на какой-то код :-). –

+1

Я думаю, что некоторый тип стандартного 'SetEditor' (возможно, делегирования' ListEditor') должен быть предоставлен GWT. У меня была та же проблема, что и у OP, и в конечном итоге выставлял «List'-typed accessors (преобразование реального свойства« Set'-typed ») в класс домена, чтобы иметь возможность использовать« ListEditor ». Но это не всегда возможно (иногда нам просто нужно «установить» поведение на стороне клиента) –

+2

Проблема в том, что a) У Set по определению нет определенного порядка, а подредакторами для значений обязательно являются _list_ и б) вы, вероятно, захотите разрешить дублирование значений во время редактирования и только проверить уникальность в _flush_ time, но вам нужно как-то сказать пользователю, когда это так («эй, у меня было 4 значения, и когда я его сохранил, осталось только 3 из них!"); и уникальность зависит от того, как вы реализовали 'equals()' в отредактированных объектах. Если вы можете придумать _standard_ 'SetEditor', то, пожалуйста, внесите свой вклад! –

3

Я сделал это с точками и маршрутами (один маршрут содержит N точек):

Route (Composite):

@UiField 
TextBox name; 

@Ignore 
@UiField 
FlexTable listPoints; 

PointsEditor pointsEditor = new PointsEditor(); 

    .... 

pointsEditor.add(String id); 

PointsEditor:

public class PointsEditor implements HasRequestContext<List<PointProxy>>, ValueAwareEditor<List<PointProxy>> { 

    List<PointProxy> points = new ArrayList<PointProxy>(); 

    public void add(String id) { 
     PointProxy point = ctx.create(PointProxy.class); 
     point.setId(id); 
     points.add(point);   
    } 

маршрута (на стороне сервера):

@Embedded 
private List<Point> points = new ArrayList<Point>(); 

R outeProxy

public interface RouteProxy extends EntityProxy { 

     abstract List<PointProxy> getPoints(); 

     abstract void setPoints(List<PointProxy> points); 

PointProxy

public interface PointProxy extends ValueProxy { 

... 

} 
+0

Я понимаю, что вы имеете в виду, но вопрос в следующем: Учитывая, что PointProxy имеет несколько полей и собственный редактор, как я соединяю точки? Обратите внимание, что вопрос о Set нет Список Редактирование списка тривиально, учитывая вспомогательный класс в GWT SDK и соответствующий пример кода. –

+0

Забыл упомянуть RouteProxy (EntityProxy) и PointProxy (ValueProxy). Оба были добавлены в ответ. Просто попробуйте сделать вместо списка. –