2016-10-23 13 views
2

Я занимаюсь электронным дистанционным модулем. В моем основном-процессе я создал это переменный:электронный пульт.getGlobal() возвращает «undefined» после window.location.replace()

global.storage = {}; 

Моего рендер-процесс инициализируется с файлом под названием startup.html.

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

Там, я включаю яваскрипт файл, содержащий следующую функцию:

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

Значение Я передаю это "привет", и при вызове на ...

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

... после присвоения значения он возвращает «привет», как и должно быть. Однако после того, как местоположение окна было заменено на general.html, в котором я включаю яваскрипт файл, содержащий эту функцию:

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

... он возвращает неопределенной. Почему? Может ли кто-нибудь помочь мне понять это?

ответ

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