如何简单地重定向到另一个toplevel Seaside组件?

时间:2011-11-02 07:51:52

标签: components smalltalk pharo seaside

新手问题。谷歌一直没有任何帮助。此外,我遇到的问题有点难以解释。

我的应用程序中有两个组件:JournalView和JournalEntryView。 JournalView显示日记条目列表,其中包含指向各个条目的链接。单击时,每个链接都应创建一个新的JournalEntryView并重定向到这个新创建的JournalEntryView。

目前,我这样做:

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

问题是,此代码希望新创建的组件稍后用值回答。看看晕圈,我可以看到以下组件层次结构:

JournalView
    WADelegation
        WAAnswerHandler
            JournalEntryView

我不想要这个。我希望我的JournalEntryView是一个顶层视图,我只想让我的锚点重定向到一个新的顶级JournalEntryView。

这可能在Seaside吗?

3 个答案:

答案 0 :(得分:4)

您可以使用公告。它应该是这样的:

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

然后,当您声明ComponentA时。你做这样的事情:

ParentComponent>>initialize
    super initialize.
    componentA := (ComponentA new 
        on: ViewEntryAnnouncement do: [ :ann | 
            | entryView |
            entryView := JournalEntryView new.
            entryView entry: ann entry.                 
            self call: entryView ];
        yourself)

通过这种方式,您宣布您的父母发生了一些事情并且您的父母可以做出反应。

这种方法大部分时间都有效,但您需要为组件添加机器以响应公告(默认情况下没有准备好)。如果可以,更好的方法是在层次结构的顶层创建自己的Component类,谁可以处理公告。 有一些例子(在Pharo中)......

希望这会有所帮助:)

答案 1 :(得分:1)

您可以在会话中调用访问者#rootPresenter:来替换根组件。不是你通常会做的事情,但它是可能的。

self requestContext rootPresenter: aComponent

答案 2 :(得分:1)

嗯,真的很奇怪的问题。不要忘记Seaside是一个Web应用程序框架,并不提供显示不同的静态页面。 Seaside的主要思想还有延续概念,即流动或链条等。 因此,您只有一个Web应用程序的入口点。并且为了轻松控制流程,我们建议使用任务控制器。请参阅WATask并阅读here

顺便说一下,its very bad style to call from renderContentOn:.