2009-05-08 37 views
17

Ostatnio opracowuję aplikację internetową w Seaside + Squeak i uznałem ją za wspaniałe doświadczenie. Nad morzem naprawdę jest głowa i ramiona ponad każdą inną strukturą i czuję, że pracuję na wyższym poziomie abstrakcji (powyżej żądania HTTP/cyklu odpowiedzi i szablonowania HTML, z którym radzą sobie inne frameworki).Kiedy używać komponentów Seaside i kiedy używać prostych obiektów renderowania?

Powiedziałem, że jestem nieco zdezorientowany komponentami Seaside. Niedawno musiałem wyświetlić listę obiektów na komponencie (podobne do strony głównej stackoverflow). Na początku uczyniłem każdy obiekt komponentem (podklasą WAComponent), ale okazało się to naprawdę marnotrawstwem i musiałem dynamicznie ustawić #children w komponencie nadrzędnym, aby w ogóle działało. Następnie próbowałem robić je renderować obiekty (obiekty, które nie są podklasami WAComponent i renderowania przy użyciu renderOn: zamiast obiektu renderContentOn :, podobnie jak komponenty). To zadziałało, ale teraz nie mogły już uzyskać dostępu do stanu globalnego w obiekcie sesji, tak jak komponenty mogą (używająC#session). Następnie odkryłem "Wartość WACurrentSession", która daje każdemu obiektowi dostęp do bieżącego obiektu sesji Seaside. Teraz mogłem uczynić je renderującymi obiektami. Ponadto odkryłem, że mogę przepisać wiele innych, bardziej pomniejszych komponentów, również jako obiekty renderowania.

Poza tym, że potrzebne jest wywoływanie/odbieranie lub cofanie, jakie są inne powody używania komponentów do renderowania obiektów?

Odpowiedz

16

Jest to częste zamieszanie dla nowych użytkowników nad morzem. Staraliśmy się, aby było to jaśniejsze w Seaside 2.9, która jest obecnie w Alphie, ale spróbuję skupić się na 2.8 tutaj, ponieważ brzmi to tak, jak tego używasz.

Przede wszystkim masz rację, że nie musisz używać komponentu, aby uzyskać dostęp do sesji. Seaside 2.9 przenosi #session aż do nowej klasy WAObject, dzięki czemu jest dostępny dla prawie wszystkich obiektów nad morzem (w tym komponentów), ale na pewno możesz odnieść się do numeru WACurrentSession na razie w wersji 2.8.

Komponenty zapewniają w przybliżeniu następujące funkcje w 2.8:

  1. #renderContentOn: jest wywoływana z instancją niezależnie od klasy renderujący określić w #rendererClass (zamiast cokolwiek renderer jest używany, gdy obiekt jest proszony, aby uczynić siebie)
  2. Hak (#updateUrl:), aby umożliwić aktualizację URL używany przez renderer generować linki
  3. wieszaki (#updateRoot:, #style, #script), aby umożliwić aktualizację sekcji HEAD dokumentu HTML
  4. możliwość być korzeniem wniosku
  5. Haki (#updateStates:, #states), aby stan backtracking łatwiej
  6. Hak (#initialRequest:), aby umożliwić inicjalizacji na podstawie wniosku, który spowodował Sesja zostać utworzony
  7. Instrument (#children), aby upewnić się, że wszystkie elementy pod tobą będzie również mają wyżej zwane haki na nich
  8. możliwość dodawania Ozdoby
  9. możliwość pokazać/odbierania/połączenia (używa Odznaczenia)
  10. Niektóre metody ogólnospożywczy (#inform:, #isolate: itp)

Jeśli nie potrzebujesz żadnego z powyższych, nie potrzebujesz komponentu. Jeśli potrzebujesz którejś z powyższych rzeczy, potrzebujesz komponentu, chyba że chcesz wdrożyć równoważną funkcjonalność na własnej klasie.

Najprostsza metryka to prawdopodobnie: jeśli chcesz zachować obiekt wokół żądań HTTP, powinien to być komponent; jeśli chcesz wyrzucić obiekt i utworzyć go na każdym przebiegu renderowania, prawdopodobnie nie musi tak być. Jeśli wyobrazisz sobie aplikację wyświetlającą strony bloga, prawdopodobnie masz Komponenty na menu, dziennik blogu, treść bloga, każdy komentarz i tak dalej. Warto rozważyć odczyt znaczników bloga i generowanie jego kodu HTML, aby można było obsługiwać różne znaczniki lub różne renderery, a także aby komponenty komentarzy mogły obsługiwać te same znaczniki. Można to zrobić za pomocą klasy innej niż komponentowa, która implementuje #renderOn: i może być tworzona i używana przez inne komponenty w razie potrzeby.

Nadmorski 2,9 obecnie dzieli powyższą funkcjonalność, wykonując WAPresenter beton i wprowadzając jako jej nadklasę. 1-3 powyżej są realizowane na WAPainter i 4-7 na WAPresenter, więc masz wybór co do podklasy w zależności od Twoich potrzeb. Usuwa również wiele metod z WAPresenter i WAComponent, aby ułatwić użytkownikom końcowym zrozumienie.

Nadzieję, że pomaga.

+0

Dziękujemy za szczegółową odpowiedź! –

Powiązane problemy