2017-08-17 2 views
0

J'ai un panneau (disons AlertPanel) qui a besoin d'être rafraîchi pour certaines conditions quand un rendu de listView.Comment puis-je actualiser un Panel à partir d'un autre ListView dans Apache Wicket?

Je pense à mettre à jour la AlertPanel dans onBeforeRender() méthode de cycle de vie de listview.

J'ai essayé de passer outre onBeforeRender() comme this-

  @Override 
      protected void onBeforeRender() { 
       super.onBeforeRender(); 
       // update alert panel with some API of Component here 
       // I can get panel object like this 'this.getPage().get("alertPanel");' 
      } 

Une fois que je this.getPage().get("alertPanel"), je ne sais pas ce que l'API de org.apache.wicket.markup.html.panel.Panel appeler afin que je puisse rafraîchir/repeindre AlertPanel

+0

Utilisez le composant 'replace' qui fonctionnera pour vous. Consultez ce lien https : //ci.apache.org/projects/wicket/guide/6.x/guide/componentLifecycle.html. Mais je ne suis toujours pas satisfait de la façon dont vous appelez le 'AlertPanel' – soorapadman

+0

Merci pour la réponse, cependant s'il vous plaît mettez tout en un seul commentaire car il devient alors difficile de se référer. De plus, veuillez préciser la raison pour laquelle le fait de renvoyer le Panel sur mon chemin n'est pas bon. – Vishal

+0

@soorapadman Quel est le problème de cette façon? S'il vous plaît suggérer un meilleur et un remplacement n'est pas disponible à 'this.getPage(). Get (" alertPanel ")' car il retourne un 'Component'. Je peux le lancer mais je ne pense pas que je devrais comme Component a déjà 'replaceWith()' que j'ai essayé mais ne fonctionne pas. – Vishal

Répondre

1

Si le rendu a commencé (et il semble qu'il a - onBeforeRender()) alors vous ne serez pas en mesure de remplacer des composants.

Vous devez déplacer votre logique vers la phase ACTION, par ex. OnClick(), onSubmit(), etc Dans une telle méthode d'action diffusé un événement: send(getPage(), Broadcast.DEPTH, new SomeCustomEvent()). Ensuite, dans le parent d'AlertPanel, vous devez remplacer #onEvent (IEvent) et lorsque la charge utile de l'événement est SomeCustomEvent, effectuez le remplacement.

Pour plus d'informations lire: https://ci.apache.org/projects/wicket/guide/7.x/single.html#_wicket_events_infrastructure

+0

Vous avez raison d'une manière. si le composant est la même page, pourquoi faut-il utiliser l'événement 'broadcast'? 'target.add (alertPanel)' As-tu raison? pardonne-moi si je me trompe. – soorapadman

+0

Si vous avez une référence entre les composants, vous n'avez pas besoin d'événements. Mais assez souvent, la page est construite avec des composants/conteneurs séparés qui ne savent rien l'un de l'autre. Pour éviter un couplage serré, je recommande de communiquer via des messages, c'est-à-dire des événements. –

0

Il y a deux façons: 1) le complexe: l'utilisation des auditeurs 2) ou dominante méthode d'utilisation, comme celle-ci:

AlertPanel alertPanel = new AlertPanel(); 
alertPanel.setOutputMarkupId(true); 

ListView list = new MyListView(){ 
    @Override 
    protected onMyEvent(AjaxRequestTarget target){ 
     target.add(alertPanel); 
    } 
} 

page.add(alertPanel,list); 

méthode onMyEvent() de MyListView peut être abstrait et doit être appelé où vous voulez mettre à jour le alertPanel à l'intérieur de MyListView (par exemple lorsque le bouton est enfoncé dans certaines lignes)