2012-05-26 1 views
5

par souci de simplicité:Comment modifier un ensemble <? extends EntityProxy> avec le framework GWT Editor?

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

public class Address 
{ 
    String city; 
    String street; 
} 

avec et correspondant à

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

et

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

j'ai eu cours UiBuinder modifier AddressProxy et clair pour moi comment utiliser ListEditor dans Si j'ai une liste mais que les données sont définies dans la classe Personne Comment utiliser Editor Framework pour les modifier? Ou peut-être comment puis-je convertir Set à la liste quand il devient PersonProxy?

j'ai fait une tentative de mettre une sorte de classe d'adaptateur de l'éditeur qui mettrait en œuvre

LeafValueEditor<Set<AddressProxy>> 

puis à l'intérieur du mouvement LeafValueEditor.setValue() à une liste et de commencer une nouvelle driver.edit() sur une hiérarchie d'éditeur distincte qui s'occupe de l'édition de liste mais avec maintenant de la chance.

Répondre

6

Vous devez créer un CompositeEditor<Set<AddressProxy>, AddressProxy, AddressEditor>, semblable à un ListEditor, mais la manipulation d'un Set au lieu d'un List. Je suppose que vous pourriez en quelque sorte déléguer à un ListEditor même si je ne suis pas vraiment sûr.

+0

Merci! C'est quelque chose pour commencer. Franchement paresseux, j'espérais un lien vers un code :-). –

+1

Je pense qu'un certain type de 'SetEditor' standard (déléguant probablement à' ListEditor') devrait être fourni par GWT. J'ai eu le même problème que OP et j'ai fini par exposer des accesseurs typés 'List' (convertissant la vraie propriété' Set') sur une classe de domaine juste pour pouvoir utiliser 'ListEditor'. Mais ce n'est pas toujours possible (parfois nous avons juste besoin d'un comportement "Set" du côté client) –

+2

Le problème est que a) un Set par définition n'a pas d'ordre spécifique et les sous-éditeurs pour les valeurs sont nécessairement un _list_, et b) vous voulez probablement autoriser les valeurs dupliquées au cours de l'édition et vérifier uniquement l'unicité à _flush_time, mais vous devez en quelque sorte dire à l'utilisateur quand c'est le cas ("hé, j'avais 4 valeurs et seulement 3 d'eux!"); et l'unicité dépend de la façon dont vous avez implémenté 'equals()' dans les objets édités. Si vous pouvez créer un SetEditor _standard_ ', merci de le faire! –

3

Je l'ai fait avec les points et les routes (un itinéraire contient N Points):

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);   
    } 

Route (côté serveur):

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

Routage eProxy

public interface RouteProxy extends EntityProxy { 

     abstract List<PointProxy> getPoints(); 

     abstract void setPoints(List<PointProxy> points); 

PointProxy

public interface PointProxy extends ValueProxy { 

... 

} 
+0

Je vois ce que vous voulez dire mais la question est: Étant donné que le PointProxy a plusieurs champs et un éditeur de lui-même comment je relie les points? Et faites attention que la question est sur Set pas Liste l'édition de la liste est trivial étant donné la classe d'aide dans GWT SDK et l'exemple de code correspondant. –

+0

J'ai oublié de mentionner RouteProxy (EntityProxy) et PointProxy (ValueProxy). Les deux ont été ajoutés à la réponse. Essayez juste de faire avec Set à la place de List. –

Questions connexes