在Electron中使用ipc从渲染器设置全局变量

时间:2018-04-08 08:16:17

标签: javascript html node.js electron

renderer.js

ipcRenderer.sendSync('setGlobal', 'globalVarName').varInner.varInner2 = 'result';

main.js

global.globalVarName = {
  varInner: {
    varInner2: ''
  },
  iWontChange: 'hi'
};

ipcMain.on('setGlobal', (event, arg) => {
  console.log(arg) // should print "result"
  // what goes here?
})

console.log(varInner2) // should print "result"

是否可以这样,即以这种方式设置varInner2 globalVarName?其次,有没有办法对此进行优化,因此我们不必为每个全局变量重写此过程(即使用动态变量名称执行此操作的某种方式)?

我感谢任何想法或解决方案,对不起,如果这是一个常识问题。

2 个答案:

答案 0 :(得分:3)

使用IPC设置全局值。

当您只想读取全局变量的值时,使用getGlobal会非常有用。但是,我发现尝试使用getGlobal分配或更改其值是有问题的。

就我而言,我发现Main进程上的全局变量没有实际更改。具体来说,当刷新开发中的Electron窗口时,全局变量将重新设置为其原始值。这使得恢复开发状态成为一个问题。

不确定这是否还会在生产中发生,但我想会发生,因此,依赖于全局变量的最新值来拆分新流程将是有问题的。

相反,我最终使用了更详细的方法ipcMainipcRenderer

main.js

const { ipcMain } = require( "electron" );

ipcMain.on( "setMyGlobalVariable", ( event, myGlobalVariableValue ) => {
  global.myGlobalVariable = myGlobalVariableValue;
} );

renderer.js

const { ipcRenderer, remote } = require( "electron" );

// Set MyGlobalVariable.
ipcRenderer.send( "setMyGlobalVariable", "Hi There!" );

// Read MyGlobalVariable.
remote.getGlobal( "MyGlobalVariable" ); // => "Hi There!"

答案 1 :(得分:1)

来不及回答,但希望这会对我们未来的访问者有所帮助。 因此,基于以下IPC方法,我能够创建,访问和更新全局变量的值:

1)将此代码添加到main.js文件中:

func numberOfSections(in tableView: UITableView) -> Int {
        return invoicesSectionTitles.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let invoiceKey = invoicesSectionTitles[section]
        if let invoiceValues = invoicesDictionary[invoiceKey] {
            return invoiceValues.count
        }
        return 0
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let invoiceKey = invoicesSectionTitles[indexPath.section]

        if let invoiceValues = invoicesDictionary[invoiceKey] {
            cell.textLabel?.text = invoiceValues[indexPath.row]
        }
        return cell
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return invoicesSectionTitles[section]
    }

    func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return invoicesSectionTitles
    }

2)在第一页上使用它来更新全局变量值:

   global.MyGlobalObject = {
      variable_1: '12345'
   }

3)最后,在第二页上使用类似的内容,在该页面上,您将访问修改后的全局变量并进行打印:

require('electron').remote.getGlobal('MyGlobalObject').variable_1= '4567'

您可以在电子的documentation中找到相同的东西。