[英]How to make Electron window object accessible from within async function without global?
我正在嘗試在應用程序菜單可訪問的 Electron 應用程序中創建 BrowserWindow object 的實例,因此菜單命令可以使用該引用打開 IndexedDB 數據庫。 因為我在立即調用的異步 function 中實例化 mainWindow,所以尚不清楚如何最好地使 object 在所需文件中的代碼中可用。
index.js(主進程)
let mainWindow;
//other code here
(async () => {
await app.whenReady();
Menu.setApplicationMenu(menu);
mainWindow = await createMainWindow();
//make mainWindow available in required menu.js file
//so it can be referenced from menu command
//to access indexedDB database
})();
我希望 object 可以在 index.js 所要求的 menu.js 中訪問。
//menu setup
{
label: "Add Item to Database",
click() {
//undefined unless object can be imported
//dialog code for inputting data to be added
mainWindow.webContents.send("addItem", data);
}
},
我可以將 mainWindow 存儲在全局 object 中,但我試圖避免這種情況。 我還可以在菜單 object 上創建一個方法並將其存儲在那里,因為它可以在 menu.js 中訪問。 我不確定這是否是個好主意。 而且我想我可以簡單地將 menu.js 代碼添加到 index.js 中,因為 mainWindow 將位於 scope 中,並且在使用菜單命令時已被分配。 但我假設有更好的方法來做到這一點。 建議?
要在不使用全局變量的情況下傳遞 object,一般模式是使用 function arguments。
看起來menu.js
現在導出了object
。 相反,您可以導出返回object 的 function。
然后,而不是調用Menu.setApplicationMenu(menu);
,你會打電話給Menu.setApplicationMenu(menu(mainWindow));
你對go很好。
這是menu.js
的示例:
module.exports = (mainWindow) => {
label: "Add Item to Database",
click: () => {
//undefined unless object can be imported
//dialog code for inputting data to be added
mainWindow.webContents.send("addItem", data);
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.