Electron window.opener完全支持,如在浏览器中

时间:2016-09-13 16:18:01

标签: node.js shared-memory electron

我正在开发一个多窗口桌面基于电子的应用程序,我需要与主应用程序进程共享一个对象实例与应用程序的其他窗口。目前在浏览器(Chrome 52.0.2743.116)中,您可以参考window.opener来实现此目的。在浏览器window.opener(在子窗口中)将为您提供从中调用window.opent(myURL)的Window对象的实例。

例如,如果您设置window.myData = {}; (Main window) myData的同一个实例将在(子窗口)中可用,并且将通过(window.opener.myData进行访问

在Electron中,当我通过(window.opent(myURL)) window.opener替换为BrowserWindowProxy(Electron API)时,它不会公开调用(window.open(myURL))的同一窗口(Window对象实例)。 Electron中有没有办法访问window.opener,就像它在浏览器中一样?

使用remote.sharedObject(Electron API)不是一个选项,因为它只是序列化/反序列化数据,可用于将数据从一个窗口传递给其他窗口,但不允许跨窗口访问相同的对象实例。

2 个答案:

答案 0 :(得分:1)

要更正window.opener,并使用facebook(及其他)登录名

您需要使用webPreferences.nativeWindowOpen=true,并为mainWindow设置相同的webPreferences.affinity,并打开窗口(钩住mainWindow.webContents.on('new-window')https://gist.github.com/Gvozd/2cec0c8c510a707854e439fb15c561b0

答案 1 :(得分:0)

我不认为你对remote api是对的。来自doc

  

远程模块返回的每个对象(包括函数)代表主进程中的对象(我们将其称为远程对象或远程函数)。

试试这个:

'use strict'
let Electron = require('electron')
let mainWindow = null

class myObj {
  constructor(d) {
    console.log('constructor ' + d)
    this.d = d
  }

  get data() {
    console.log('get ' + this.d)
    return this.d
  }

  set data(d) {
    this.d = d
    console.log('set ' + this.d)
  }
}

global.someObj = new myObj(1)

Electron.app.on('ready', () => {
  mainWindow = new Electron.BrowserWindow()
  mainWindow.loadURL(`file://${__dirname}/index.html`)
  mainWindow.webContents.openDevTools()
  mainWindow.on('closed', () => {
    mainWindow = null
  })
})
Electron.app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    Electron.app.quit()
  }
})

<!DOCTYPE html>
<html>
  <head>
    <script>
      let obj = require('electron').remote.getGlobal('someObj')
      console.log(obj)
      console.log(obj.data)
      obj.data = 2
      console.log(obj.data)
    </script>
  </head>
  <body></body>
</html>