2013-03-26 9 views
5

SOとelsewhereに関するこのトピックに関するいくつかの関連する質問がありますが、この特定の質問について決定的な回答は見つかりませんでした。dataTable行を選択すると新しいページを開く(新しいサイトに移動する)

私にはp:dataTableがあります。行をクリックして詳細ページ(新しいページで、ダイアログやウィンドウではない)を開く可能性があります。

私は(:http://web.archive.org/web/20101001223235/http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf何らかの理由で、それはもはや存在しない、私はprimefacesのWebサイトから持っている):このようにそれを解決した

:ナビゲーションは、その後、豆に実行され

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

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

私の質問:バッキングビーンの助けを借りずにJSF内でこれを行う方法はありますか?

私はまた、primefacesサイトからexrameleというコードを削除したため、このようなことを行う正しい方法ではない可能性があります。

答えて

1

本当に完璧な解決策が見つからなかったので、これは今私がやる方法です。私が言ったように、

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

本当に完璧ではないが、私は好き:私は「ナビゲーター」クラスこの

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

のように今持っていると私は私のAjaxイベントから、このクラスを呼び出す

実際に私のバッキングBeanにコードを書く必要はありません。 (もちろん、ナビゲータ用のコードを書く必要がありますが、再利用することができます)

1

これはajaxリクエストであるため、通常、リクエスト/レスポンスはWebページの一部のコンポーネントを再レンダリングするために使用されます。あなたができることは、

<p:ajax event="someventofintrest" onsuccess="javascript:myjsmethod();"></p:ajax> 

and 

<p:remotecommand name="myjsmethod" action="#{mybean.mybeanmethod}" /> 

and in the backing bean 

public String mybeanmethod(){ 
    return "mynewpage"; // Navigate away to mynewpage.xhtml 
} 

HTHです。

+0

true - 実際はそれほどコードではありません。私は '

+0

ええ、しかし、AJAXのリクエストは実際には現在のページから移動するためのものではありません。コマンドコントロール(コマンドボタン、コマンドリンク、リモートコマンドなど)からのアクションメソッドのみがナビゲーション機能を実行します。このリンクを参照してください:http://stackoverflow.com/questions/5406855/jsf-navigation-with-ajax – maggu

+0

あなたはそうです。私はajaxを使用せずにいくつかの解決策を探しているように見えますが、 'p:datatable'を使用しているときにはうまくいかないでしょう。 –

8

シンプルに対象の細胞をラップします<h:link>

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

必要であれば、それは全体のセルにまたがるようにするには、リンク上のCSS display:block使用してください。必要に応じて、ネストされた<f:param>を使用してリクエストパラメータを渡すことができます。

+1

ニース、それは動作します。しかし、すべてのセル(列)の周りに ' 'をラップする必要があるので、私が探していた究極のワンラインソリューションではありません。たぶん私はあまりにも特定! (Btw、 'display:block'ヒントの追加のおかげで) –

+1

それはあなたがそれをSEOにやさしく保ちたいなら、それはあなたが得ることができる最高です。 – BalusC

+0

SEO - 以前はそれについて考えていませんでした。喜んで私のアプリケーションは内部のみです。私は自分のニーズに合ったやり方を見つけ出し、豆を裏打ちするのにあまりにも多くのコーディングを必要としません。 –

関連する問題