2014-06-30 12 views
10

Kiedy należy używać zdarzenia preRenderView do inicjowania danych strony w porównaniu z użyciem viewAction? Czy są równe w użyciu i czy mają ten sam efekt?Kiedy używać preRenderView a viewAction?

preRenderView Event

<f:metadata> 
    <f:event type="preRenderView" listener="#{myBean.initialize}"/> 
</f:metadata> 

lub

viewAction

<f:metadata> 
    <f:viewAction action="#{myBean.initialize}"/> 
</f:metadata> 

Odpowiedz

16

W praktyce można je stosować, aby osiągnąć ten sam efekt, ale viewAction (nowa z JSF2. 2) zawiera następujące udoskonalenia:

  1. onPostback: viewAction pochodzi z tego atrybutu, który pozwala określić, czy działania, które należy wykonać na odświeżenie strony do samego widoku (czyli na odświeżenie strony lub przycisk złożyć etc). Domyślnie jest to false, więc nie musisz go nawet określać, jeśli nie potrzebujesz. Aby osiągnąć ten sam efekt z preRenderView, musisz

    <f:metadata> 
        <f:event type="preRenderView" rendered="#{facesContext.postBack}" listener="#{myBean.initialize}"/> 
    </f:metadata> 
    
  2. phase: Atrybut ten pozwala określić, że działania realizowane w określonym etapie JSF. Domyślnie jest to INVOKE_APPLICATION, ale wszystkie pozostałe identyfikatory fazy JSF są tutaj poprawne.

  3. if: Ten atrybut umożliwia podanie wyrażenia wartości, które jest wynikiem wyniku boolowskiego. Działanie widoku zostanie wykonane tylko w wyniku tego wyrażenia.

  4. immediate: Ten atrybut teraz przyznaje zdolność dotyczący viewAction być wykonywany podczas fazy APPLY_REQUEST_VALUES (przed fazą domyślny INVOKE_APPLICATION), co pozwala zachowywać się jak zwykły UIComponent

Ogólnie , viewAction jest czystszym podejściem do wykonywania poleceń przeglądania.

+1

Sztuczka z 'renderowanym =" ... "' z tagiem '' nie działa dla mnie (na Wildfly 9.0 z Mojarra 2.2.11). Zgodnie z dokumentacją [JSF 2.2 VDL] (https://docs.oracle.com/javaee/7/javaserver-faces-2-2/vdldocs-facelets/), '' nie ma 'renderowanego- atrybut. –

+0

Nie jest to udokumentowane @ MartinHöller, ale ja (miałem, kiedy napisałem tę odpowiedź) JSF2.2 na GF4, a tag zawiera atrybut "renderowany". Być może było to niedopatrzenie ze strony deweloperów. – kolossus

+0

Być może bahawiński zmienił się z niewielką wersją, ale próbowałem 'render =" false "', a metoda określona przez atrybut 'listener' został wywołany za każdym razem, gdy zażądano widoku. –

Powiązane problemy