2013-03-26 9 views
5

Tam kilku powiązanych pytanie na ten temat na SO i elsewhere, ale nie mogłem znaleźć ostateczną odpowiedź na to konkretne pytanie.otworzyć nową stronę (należy przejść do nowej strony) przy wyborze DataTable wiersz

Mam p:dataTable i chcę mieć możliwość kliknięcia w wiersz i otworzyć stronę szczegółów (nowa strona, a nie okno dialogowe lub okno).

Rozwiązałem to w ten sposób (co mam ze strony primefaces, z jakiegoś powodu nie jest już tam: http://web.archive.org/web/20101001223235/http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf):

<p:dataTable var="order" value="#{orderBean.orders}" selection="#{orderBean.selectedOrder}" selectionMode="single" rowKey="#{order.number}"> 
    <p:ajax event="rowSelect" listener="#{orderBean.orderSelect}"/> 
    <p:column ... /> 
</p:dataTable> 

Nawigacja jest następnie wykonywany w fasoli:

public void orderSelect(SelectEvent event) { 
    ConfigurableNavigationHandler nh = (ConfigurableNavigationHandler)FacesContext.getCurrentInstance().getApplication().getNavigationHandler(); 
    nh.performNavigation("orderDetail?faces-redirect=true"); 
} 

Moje pytanie: czy istnieje sposób to zrobić tylko wewnątrz JSF bez pomocy fasoli podkładu?

Ja również z prośbą, ponieważ usunięto exmaple kodu z witryny primefaces, co może wskazywać, że to nie jest właściwy sposób zrobić coś takiego.

Odpowiedz

1

Jak nie znaleźć naprawdę doskonałe rozwiązanie, to w jaki sposób mogę to zrobić teraz.

mam teraz klasa "nawigator" jak to

@Component 
public class Navigator { 
    public void nav(String page) { 
    UIHelper.navigateTo(page); 
    } 
} 

i wzywam do tej klasy z mojego ajax imprezy:

<p:ajax event="rowSelect" listener="#{navigator.nav('orderDetail')}"/> 

Jak powiedziałem, tak naprawdę nie jest idealne, ale podoba mi się fakt, że nie muszę pisać kodu w moim zapleczu. (Oczywiście muszę napisać kod dla Navigator, ale że mogę ponownego wykorzystania).

1

ponieważ jest to żądanie ajax, zazwyczaj żądanie/odpowiedź służy do ponownego renderowania niektórych komponentów na stronie internetowej. Co można zrobić, to:

HTH.

+0

prawda - ale to naprawdę nie jest mniej kodu. Myślałem o czymś w rodzaju '

+0

Tak, ale prośby ajaxowe tak naprawdę nie służą do opuszczenia bieżącej strony. Tylko metody działania z elementów sterujących poleceniami (przyciski poleceń, komendy, zdalne polecenia itp.) Spełniają funkcję nawigacji. Zobacz ten link: http://stackoverflow.com/questions/5406855/jsf-navigation-with-ajax – maggu

+0

Masz rację. Wygląda na to, że szukam jakiegoś rozwiązania bez użycia ajax - ale myślę, że to nie zadziała, gdy używam 'p: datatable'. –

8

owijane komórka (i) będących przedmiotem zainteresowania w prosty <h:link>.

<p:column> 
    <h:link outcome="orderDetail"> 
     ... 
    </h:link> 
</p:column> 

użycie w razie potrzeby CSS display:block na link, aby pozwolić mu objąć całą komórkę. Możesz w razie potrzeby przekazać parametry żądania za pomocą zagnieżdżonego <f:param>.

+1

Dobrze, że działa. Ale ponieważ muszę owijać '' s wokół każdej komórki (kolumny), wciąż nie jest to ostateczne rozwiązanie jednoliniowe, którego szukałem. Może jestem zbyt szczególny! (Btw, dodatkowe podziękowania za podpowiedź 'display: block'.) –

+1

Dobrze, ale najlepiej, jeśli chcesz zachować SEO. – BalusC

+0

SEO - nie myślałem o tym wcześniej. Chętnie moja aplikacja jest tylko wewnętrzna.Sądzę, że znalazłem sposób na to, który pasuje do moich potrzeb i nie wymaga zbytniego kodowania w ziarnach. –

Powiązane problemy