2011-11-02 1 views
4

Question débutant. Google n'a été d'aucune aide du tout. D'ailleurs, le problème que j'ai est un peu difficile à expliquer correctement.Comment puis-je simplement rediriger vers un autre composant Seaside de niveau supérieur?

J'ai deux composants dans mon application: un JournalView et un JournalEntryView. Le JournalView affiche une liste d'entrées de journal avec des liens vers des entrées individuelles. Une fois cliqué, chacun de ces liens devrait créer un nouveau JournalEntryView et rediriger vers ce JournalEntryView nouvellement créé.

Actuellement, je fais ceci:

html anchor 
    callback: [ 
     entryView := JournalEntryView new. 
     entryView entry: anEntry. 
     self call: entryView ]; 
    with: '(read more)' ] 

problème est, ce code prévoit que le composant nouvellement créé pour répondre à une valeur plus tard. En regardant les halos, je peux voir la hiérarchie suivante des composants:

JournalView 
    WADelegation 
     WAAnswerHandler 
      JournalEntryView 

Je ne veux pas cela. Je veux que mon JournalEntryView soit une vue de premier niveau et je veux juste que mes ancres redirigent vers un nouveau JournalEntryView de haut niveau.

Est-ce possible dans Seaside?

Répondre

4

Vous pouvez utiliser des annonces. Cela devrait être quelque chose comme ceci:

ComponentA>>renderContentOn: html 
    html anchor 
     callback: [ 
      self announce: (ViewEntryAnnouncement with: anEntry) ]; 
     with: '(read more)' ]. 

puis, lorsque vous déclarez ComponentA. Vous faites quelque chose comme ceci:

De cette façon, vous annoncez que quelque chose s'est passé et que votre parent peut réagir.

Cette approche fonctionne la plupart du temps, mais vous devez ajouter des machines aux composants pour réagir aux annonces (elles ne sont pas prêtes par défaut). Si vous le pouvez, une meilleure approche consiste à créer votre propre classe Component, en haut de votre hiérarchie, qui peut gérer les annonces. Il quelques-uns des exemples autour (en Pharo) ...

Hope this helps :)

1

Vous pouvez remplacer le composant racine en appelant le #rootPresenter accesseur: dans votre session. Ce n'est pas quelque chose que vous feriez habituellement, mais c'est possible.

self requestContext rootPresenter: aComponent 
1

Hm, question vraiment étrange. N'oubliez pas que Seaside est un framework d'application web et non fourni pour montrer différentes pages statiques. Aussi l'idée principale de Seaside est le concept de continuation, c'est-à-dire quelque chose comme un flux ou une chaîne. Par conséquent, vous avez un seul point d'entrée de votre application Web. Et pour contrôler facilement le débit, il est recommandé d'utiliser le contrôleur de tâches. Voir WATask et lire here.

Et, en passant, its very bad style to call from renderContentOn:.

+0

Alors, comment recommanderiez-vous le faire? Je ne veux pas le flux de contrôle avancé offert par Seaside dans ce cas. Devrais-je abandonner et utiliser appel pour obtenir le JournalEntryView pour rendre une entrée? –

+1

Il n'était pas # appelant de #renderContentOn: (vous ne pouvez même pas faire cela), il l'a fait à partir d'un rappel qui est bien. – milan

Questions connexes