2017-07-28 10 views
-2
のダーティエリア(カスタム警告メッセージ)ダイアログ

ショーJSF/Primefaces

何かがページに変更し、保存せずに別のページをクリックすると、私は言ってポップアップダイアログを表示する必要がありますそれ、ちょっとあなたが何かを変更したいのですか?、ユーザーの選択に基づいて、保存/キャンセル/機能のいずれかを行う必要があります。

私はリンク、 to track the changes in JSF

それは同じBeanクラスにあり、キャンセルボタンをクリックした場合、私はいくつかの関数を記述し、このダイアログを表示することができますを見て。

しかし、ユーザーが他のリンク/ページまたはメニュー項目をクリックしてこのケースの処理方法をクリックした場合。

フローは他のBeanに行く前に最後のメソッドを呼び出す必要がありますか?

セキュリティブラウザのために検索したところ、カスタム警告メッセージが表示されません。

@PreDestroy 
public void destroy() { ..} 

私はこれを試しましたが、毎回他のリンクをクリックすると正しく呼び出されません。他の方法はありますか?

答えて

1

アプリケーションの変更をキャプチャするには、ダーティーフラグを導入する必要があります。コンポーネントの値のいずれかが変更された場合、アプリケーションはdirtyフラグの値をtrueに設定する必要があります。以下の例のように。

<h:inputText id="someId" onchange="setDirty();" 
    value="#{myManager.name}" maxlength="100"> 

ユーザー保存せずに、次のページを移動しよう、そしてWindowBeforeUnloadListenerは、最初のトリガする値がtrueの場合だけで、ブール変数をチェックし、確認のポップアップが表示されます。

var dirty = true; 
window.onunload = windowUnloadListener; 
window.onbeforeunload = windowBeforeUnloadListener; 
window.onload = windowLoadListener; 

/* 
* Listener for Window-Onbeforeunload event. 
* Called before unloading (leaving the current page) the window. 
* This function checks for the dirty flag and pops up the 
* message to confirm wit the user. 
*/ 
function windowBeforeUnloadListener() { 
    if(dirty) { 
     return "You have used navigation controls that are not part of the page.\n\n 
     If you wish to end, click 'Leave this page'. " 
     + "Your session will end here.\n\n" 
     + "If you wish to continue to use then please click 'Stay on this page'."; 
    } 
} 

ページの読み込みと保存時に、dirtyフラグの値をfalseに設定します。

/* 
* Listener for Window-Onload event. 
* Called every time a new page is loaded. 
* This function will reset the flag. 
*/ 
function windowLoadListener(){ 
    dirty= true; 
} 

注:カスタム検証メッセージはIEでは機能しません。デフォルトのブラウザ検証メッセージが表示されます。