Как просто да пренасоча към друг Seaside компонент от първо ниво?

Въпрос за начинаещи. 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 от първо ниво.

Възможно ли е това в Морския бряг?


person Ankur Sethi    schedule 02.11.2011    source източник


Отговори (3)


Можете да използвате съобщения. Трябва да е нещо подобно:

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)...

Надявам се това да помогне :)

person EstebanLM    schedule 02.11.2011

Можете да замените основния компонент, като извикате инструмента за достъп #rootPresenter: във вашата сесия. Не е нещо, което обикновено бихте направили, но е възможно.

self requestContext rootPresenter: aComponent
person Lukas Renggli    schedule 02.11.2011

Хм, наистина странен въпрос. Не забравяйте, че Seaside е рамка за уеб приложение и не е предвидена за показване на различни статични страници. Също така основната идея на Seaside е концепцията за продължение, т.е. нещо като поток или верига. Следователно имате само една входна точка на вашето уеб приложение. И за лесно управление на потока препоръчваме да използвате контролера на задачите. Вижте WATask и прочетете тук.

И, между другото, много лош стил за обаждане от renderContentOn:.

person kirander    schedule 02.11.2011
comment
И така, как бихте препоръчали да направите това? Не искам разширения контролен поток, предлаган от Seaside в този случай. Трябва ли просто да се откажа и да използвам call, за да накарам JournalEntryView да изобрази запис? - person Ankur Sethi; 05.11.2011
comment
Той не беше #call-ing от #renderContentOn: (дори не можете да направите това), той го направи от обратно извикване, което е добре. - person milan; 05.02.2012