2016-09-19 22 views
7
  • 私は書いているアプリケーションを作っています。ユーザーは、アプリケーションを開いたり、テキストを書き込んだり、仕事を保存したりすることができます。ボタンをクリックすると、(a)必要に応じて仕事を保存するか、(b)ただ終了する。
  • 私はこれを達成するためにwindow.beforeunloadを使用しようとしていますが、ループを止めようとしているところで、「終了」を試みると同じプロンプトが無期限に表示されます。

ここにいくつかのコードです:アプリケーションがセットアップされたときにウィンドウを閉じる前に保存/終了を促す

windowCloseCheck() { 
window.onbeforeunload = function(e) { 
    e.returnValue = false; 
// window.alert('try to close me');  
if(file.isUnsaved() || file.hasChanged()) { 
    // prompt - save or just quit? 
    file.fileWarning('You have unsaveeed work.', 'Save', 'Quit', function(){ 
    // OPTION A - save 
    file.save(); 
    }, function() { 
    // OPTION B: Quit. 
    ipcRenderer.send('quitter') 
    }) 
} 

else { 
    // file is saved and no new work has been done: 
    ipcRenderer.send('quitter') 
} 

windowCloseCheckは、ウィンドウを閉じるためのイベントリスナーを開始し、起動されます。私の条件は、ファイルが保存されていないか、元のファイルから変更されているかをチェックすることです。

fileWarningは、電子ダイアログボックスをラップするだけの機能で、2つの選択肢と各選択肢を呼び出す機能がポップアップ表示されます。

残りのコードはavailableです(必要な情報を除外している場合)。私が非常に明確でないかどうかを明確にすることができれば幸いでしょう。

enter image description here

答えて

0

私は(メインプロセスからの)ビットにレンダリングプロセスを粉砕するwindow.destroy()を使用して一緒に行くことになった:良いことがあるようですと、これが推奨されている場合

ipcMain.on('quitter', (e) => { 
    mainWindow.destroy(); // necessary to bypass the repeat-quit-check in the render process. 
    app.quit() 
}) 

本当にわかりません電子アプリを適切に終了する方法。あなたがより良い答えを知っていれば、どんなフィードバックをもらえれば幸いです!

/shrug!

9

// Create the browser window. 
    mainWindow = new BrowserWindow({width: 400, height: 400}) 


    mainWindow.on('close', function(e){ 
    var choice = require('electron').dialog.showMessageBox(this, 
     { 
      type: 'question', 
      buttons: ['Yes', 'No'], 
      title: 'Confirm', 
      message: 'Are you sure you want to quit?' 
     }); 
     if(choice == 1){ 
     e.preventDefault(); 
     } 
    }); 
+0

これはこれまでのところ、この問題に取り組む最も良い方法です。私は数日の間にさまざまなアプローチを試みてきましたが、バイパスする必要があることは常にあります。しかし、このアプローチは完璧に機能し、問題を起こすことなくこれを行うための唯一の方法です...少なくとも電子版では1.4.15 – Darthur

1

(私の場合、それはmain.js内で宣言のcreateWindow()関数の)あなたがブラウザのウィンドウを定義した関数内で、次のブロックを追加してくださいAwijeetのソリューションは完璧です! Bth、thx Awijeet:時間が節約できました! ;-)

また、さらに進む必要がある場合は、e.preventDefault()がコードのどこにでも広がっていることにご注意ください。 preventDefault()を正しく管理したら、変数e.defaultPrevented = falseを有効にして、アプリの自然な動作に戻す必要があります。

実際には、e.preventDefault()の機能は、変数e.defaultPreventedtrueの値を変更するまで有効です。

+0

e.defaultPrevented = falseこれは私が探していたものです。感謝! –

関連する問題