4

新手问题。谷歌根本没有帮助。此外,我遇到的问题很难正确解释。

我的应用程序中有两个组件: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。

这在海边可以吗?

4

3 回答 3

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)

这样,您就可以向您的父母宣布发生了某些事情,并且您的父母可以做出反应。

这种方法在大多数情况下都有效,但您需要向组件添加机制以对公告做出反应(默认情况下没有准备好)。如果可以,更好的方法是创建自己的组件类,在层次结构的顶部,谁可以处理公告。周围有一些例子(在Pharo)......

希望这可以帮助 :)

于 2011-11-02T12:13:48.660 回答
1

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

而且,顺便说一下,从renderContentOn:调用它的风格非常糟糕。

于 2011-11-02T18:29:01.473 回答
1

You can replace the root component by calling the accessor #rootPresenter: in your session. Not something you would typically do, but it is possible.

self requestContext rootPresenter: aComponent
于 2011-11-02T16:57:24.647 回答