2012-06-14 2 views
1

Quelle serait l'approche MVP pour l'utilisation de ClickHandler de GWT?Conception MVP avec GWT ClickHandler

J'ai un bouton dans ma vue, à laquelle je voudrais ajouter un gestionnaire de clic.

Voir button.addClickHandler (?)

Ce qui est passé dans? Le présentateur? nouveau gestionnaire de clic?

Exemple 1. Voir le cas de code:

this.myButton.addClickHandler(new ClickHandler() 
    { 
     @Override 
     public void onClick(ClickEvent event) 
     { 
      myPresenter.buttonClicked(); 
     } 
    }); 

Dans ce cas, l'ajout d'un gestionnaire de clic sur le bouton ne peut pas être testé ...

Exemple de cas 2. Code Présentateur:

this.view.addClickHandlerToButton(this); 

    @Override 
    public void onClick(ClickEvent event) 
    { 
     buttonClicked(); 
    } 

Dans ce cas, le code GWT (ClickEvent) est introduit dans le présentateur, ce qui doit être évité.

Répondre

-1

Le bouton implémente une interface appelée HasClickHandlers, qui possède une méthode d'enregistrement des événements click.

Dans votre interface View, vous pouvez renvoyer cette interface à votre présentateur qui peut y ajouter addClickHandler.

Voir Interface:

public MyView extends IsWidget{ 
    public HasClickHandlers getButton(); 

} 

votre implémentation de la vue:

public HasClickHandler getButton(){ 
    return button; 
} 

Dans votre présentateur:

view.getButton().addClickHandler(new ClickHandler(){ 
.... 
}); 
+0

Si vous créez un ClickHandler dans le présentateur, cela n'expose-t-il pas le code de vue dans le présentateur, car ClickHandler et ClickEvent sont des classes gwt? – sworded

+0

oui ils le sont, mais ils peuvent être utilisés dans des tests unitaires. fondamentalement, il y a deux approches. celui que j'ai décrit - la vue n'a aucune logique. l'autre moyen passant dans le présentateur et enregistrant des événements à l'intérieur de la vue et les renvoyant –

+0

le problème est, avec cela, l'interface utilisateur ne pouvait pas facilement échanger le bouton par un autre élément de l'interface utilisateur sans clickhandler. - Voir ma réponse – dermoritz

2

i résolu ce problème de cette façon:

vue registre clickevent , et le gérer dans la vue:

onClick() { Presenter.onButtonClicked(); }

probablement le bouton a une sémantique comme « deleteEntry » de sorte que la méthode des présentateurs serait « onDeleteEntryClicked » ou « deleteEntry »

mvp dit permettent de voir décider quel type d'élément ui à utiliser et présentateur exécute la commande . donc la logique derrière "deleteEntry" ne changerait pas alors que vous pourriez substituer le bouton par un autre élément de l'interface utilisateur - également sans hasClickHandler.

+0

Cette approche fonctionne, sauf que la liaison du présentateur ne peut pas être testée. Est-ce correct? – sworded

Questions connexes