2016-10-23 6 views
2

Ich habe mit dem Remote-Modul von electron gearbeitet. In meinem Haupt-Prozess habe ich diese Variable erstellt:electron's remote.getGlobal() gibt "undefined" zurück nach window.location.replace()

global.storage = {}; 

Mein Renderer-Prozess mit einer startup.html aufgerufenen Datei initialisiert wird.

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

Da drin, ich bin eine Javascript-Datei die folgende Funktion enthält:

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

Der Wert I vorbei bin ist "Hallo", und als Aufforderung an ...

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

... nach der Zuweisung des Wertes gibt es "Hallo", wie es sollte. Sobald jedoch die Fensterposition ersetzt worden general.html, enthalten, in dem ich eine JavaScript-Datei mit dieser Funktion:

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

... es gibt undefined. Warum? Kann mir jemand helfen, einen Sinn darin zu sehen?

Antwort

4

Es gibt ein paar Dinge im Spiel hier:

  • Das remote Modul speichert entfernte Objekte in dem Renderer-Prozess beim ersten Zugriff.
  • Eigenschaften, die einem Remoteobjekt im Rendererprozess hinzugefügt werden, werden nicht an das ursprüngliche Objekt im Hauptprozess weitergegeben.
  • Navigation startet den Rendererprozess neu.

, die mit im Auge ist hier, was wahrscheinlich in Ihrem Code vor sich geht:

  1. remote.getGlobal('storage') eine neue Remote-Objekt erstellt und speichert es.
  2. remote.getGlobal('storage').exmpl = value fügt dem Remote-Objekt im Cache eine neue exmpl-Eigenschaft hinzu, übergibt sie jedoch nicht an das ursprüngliche Objekt im Hauptprozess.
  3. window.location.replace('./general.html') startet den Renderer-Prozess neu, der den Remote-Objekt-Cache wegbläst.
  4. console.log(remote.getGlobal('storage').exmpl) erstellt ein neues Remote-Objekt, da der Cache leer ist, aber da das ursprüngliche Objekt im Hauptprozess keine exmpl -Eigenschaft hat, ist es auch undefined auf dem neuen Remote-Objekt.

Das remote Modul scheint zunächst trügerisch einfach, aber es hat viele Macken hat, von denen die meisten sind nicht dokumentiert und können als solche in der Zukunft ändern. Ich würde empfehlen, die Verwendung des Moduls remote im Produktionscode zu begrenzen.

+0

Ich sehe, gibt es eine Möglichkeit, eine Variable zwischen Seitenübergängen gespeichert zu halten, ohne auf einen Server angewiesen zu sein? – Himmelslaub

+1

@Himmelslaub Wenn Sie den Zustand zwischen Seiten beibehalten wollen, behalten Sie ihn im Hauptprozess (wie Sie es schon getan haben), aber verwenden Sie die Module 'ipcRenderer' und' ipcMain', um den Zustand anstelle des 'remote' Moduls zu synchronisieren. –

+0

Danke, ich werde es versuchen! – Himmelslaub