我想创建一个非常基本的CRUD(排序)示例应用程序,以查看事情是如何工作的。
我想使用我的 listService.js 中定义的函数(例如addItem(item)
,getAllItems()
等)将项目(购物清单中的项目)存储在数组中上。
在不同的文件中使用相同的模块( listService.js )时出现了问题,因为它创建了多次存储数据的数组,我希望它像一个静态的“全局”(但不是全局变量)数组。
listService.js 如下所示:
const items = [];
function addItem (item) {
items.push(item);
}
function getItems () {
return items;
}
module.exports = {addItem, getItems};
我希望在 mainWindowScript.js 和 addWindowScript.js 中使用它,在 addWindowScript.js 中添加我想要的元素添加到数组,并在 mainWindowScript.js 中获取元素并将它们放在表中。 (稍后我将在Observer模式上实现,以便在需要时处理添加表)
addWindowScript.js 看起来像这样:
const electron = require('electron');
const {ipcRenderer} = electron;
const service = require('../../service/listService.js');
const form = document.querySelector('form');
form.addEventListener('submit', submitForm);
function submitForm(e) {
e.preventDefault();
const item = document.querySelector("#item").value;
service.addItem(item);
console.log(service.getItems());
// This prints well all the items I add
// ...
}
和 mainWindowScript.js 是这样的:
const electron = require('electron');
const service = require('../../service/listService.js');
const buttonShowAll = document.querySelector("#showAllBtn")
buttonShowAll.addEventListener("click", () => {
console.log(service.getItems());
// This just shows an empty array, after I add the items in the add window
});
在Java或C#,或C ++或其他什么我只是为每个创建一个类,并在main中我创建一个服务的实例并将它的引用传递给windows。我怎么能在这里做类似的事情?
当我第一次写这个例子时(来自youtube video)我处理了这个问题 通过 ipcRenderer 将消息发送到主模块,然后将其发送到另一个窗口,但每次从一个窗口到另一个窗口发出信号时我都不想处理此消息。
ipcRenderer.send('item:add', item);
并在主
ipcMain.on('item:add', (event, item) => {
mainWindow.webContents.send('item:add', item);
})
所以,总而言之,我想做一些事情:需要模块,在任何地方使用函数,只有一个对象实例。
答案 0 :(得分:0)
需要模块,在任何地方使用函数,并且只有一个对象实例。
TL:DR - 不,这是不可能的。
长版本:Electron的性质是多进程,您在主进程(node.js端)运行的代码和渲染器(chrome浏览器)在不同的进程中运行。因此,即使您需要相同的模块文件,每个进程中对象创建的内存不同。除了通过ipc通信同步对象之外,没有办法在进程之间共享对象。那里有几个少数同步逻辑模块,或者你可以编写你的模块做那些工作,如
module.js
if (//main process)
// setup object
//listen changes from renderer, update object, broadcast to renderer again
else (//rendere process)
//send changes to main
//listen changes from main
但无论哪种情况你都无法摆脱ipc。