2016-10-23 3 views
2

私は電子のリモートモジュールを使いこなしています。 私のメインのプロセスでは、私は、この変数を作成しました:電子のremote.getGlobal()はwindow.location.replace()の後に "undefined"を返します

global.storage = {}; 

私のレンダラ・プロセスはstartup.htmlと呼ばれるファイルで初期化されます。そこで

win.loadURL('file://' + __dirname + '/startup.html') 

、私は次の関数を含むJavaScriptのファイルが含まれています

function enterMain(value){ 
    remote.getGlobal('storage').exmpl = value; 
    window.location.replace('./general.html'); 
} 

私は渡している値が "こんにちは" である、と呼びかけ...

console.log(remote.getGlobal('storage').exmpl); 

...値を割り当てた後、 "hello"を返します。それは未定義を返す...

$(document).ready(function(){ 
    console.log(remote.getGlobal('storage').exmpl); 
}); 

:しかし、一度ウィンドウの位置とは、私は、この関数を含むJavaScriptのファイルを含め、general.htmlために交換されています。 なぜですか?誰も私がこれを理解するのを助けることができますか?

答えて

4

ここで劇中のいくつかのものがあります。

  • remoteモジュールは、最初のアクセスでレンダリングプロセスでリモートオブジェクトをキャッシュします。
  • レンダラープロセスでリモートオブジェクトに追加されるプロパティは、メインプロセスの元のオブジェクトに戻されません。
  • レンダリングプロセスを再開します。念頭に置いて

ここにおそらくあなたのコード内で何が起こっているのです:

  1. remote.getGlobal('storage')は、新しいリモートオブジェクトを作成し、それをキャッシュします。
  2. remote.getGlobal('storage').exmpl = valueは、キャッシュ内のリモートオブジェクトに新しいexmplプロパティを追加しますが、それをメインプロセスの元のオブジェクトに伝播しません。
  3. window.location.replace('./general.html')は、リモートオブジェクトキャッシュを吹き飛ばすレンダラープロセスを再開します。
  4. console.log(remote.getGlobal('storage').exmpl)キャッシュが空であるため新しいリモートオブジェクトが作成されますが、メインプロセスの元のオブジェクトにはexmplプロパティがないため、新しいリモートオブジェクトにはundefinedも含まれています。

remoteモジュールは、最初は一見シンプルだが、それは将来変更される可能性があり、文書化されていない、そのようにしているほとんどが、多くの癖を持っています。プロダクトコードでremoteモジュールの使用を制限することをお勧めします。

+0

私は、サーバーに依存せずに、ページ遷移間に変数を保存する方法はありますか? – Himmelslaub

+1

@Himmelslaubページ間の状態を永続させたい場合は、メインプロセス(実行していた状態)に保ちますが、 'ipcRenderer'と' ipcMain'モジュールを使用して 'remote'モジュールの代わりに状態を同期させます。 –

+0

ありがとう、私はそれを試してみよう! – Himmelslaub

関連する問題