Как мне просто перенаправить на другой компонент Seaside верхнего уровня? - PullRequest
4 голосов
/ 02 ноября 2011

Вопрос новичка.Google ничем не помог.Кроме того, проблему, которую я имею, довольно сложно объяснить должным образом.

У меня есть два компонента в приложении: 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.

Возможно ли это в Приморском?

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

Вы можете использовать объявления. Это должно быть примерно так:

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 голос
/ 02 ноября 2011

Хм, действительно странный вопрос.Не забывайте, что Seaside - это фреймворк для веб-приложений, который не предназначен для показа различных статических страниц.Также основной идеей Seaside является концепция продолжения, то есть нечто вроде потока или цепочки.Поэтому у вас есть только одна точка входа в ваше веб-приложение.И для легкого управления потоком рекомендуется использовать контроллер задач.Смотрите WATask и читайте здесь .

И, кстати, очень плохой стиль для вызова из renderContentOn:.

1 голос
/ 02 ноября 2011

Вы можете заменить корневой компонент, вызвав метод доступа #rootPresenter: в своем сеансе.Не то, что вы обычно делаете, но это возможно.

self requestContext rootPresenter: aComponent
...