2016-06-12 91 views
3

TL; DR:每次打開包含菜單時,都需要檢查是否禁用或啓用菜單項。我應該怎麼做?In Electron中,打開菜單時評估菜單項的狀態

詳細信息:在Electron應用程序的主菜單中,我有一個菜單項,只有當用戶在剪貼板中有某種數據時才能啓用 - 將其視爲特定種類的粘貼功能。訪問剪貼板並評估數據的有效性很容易,但我無法找到一種方法來僅在包含此特定項目的菜單打開時執行評估。

數據將來自我的應用程序外部,因此無論窗口的焦點事件何時觸發,我都可以檢查剪貼板的內容。另一種選擇是做投票。既不是很優雅,我希望有一個更明智的方法。

回答

2

電子通過menu.SetApplicationMenu(menu) function暴露菜單控件。

監聽window.focus事件,並通過遠程模塊設置這個菜單每次事件觸發器應使您能夠實現預期的功能:

<!-- index.html --> 
<script> 
const {remote} = require('electron'); 
const {Menu, MenuItem} = remote; 

const menu = new Menu(); 
menu.append(new MenuItem({label: 'MenuItem1', click() { console.log('item 1 clicked'); }})); 


window.addEventListener('focus', (e) => { remote.setApplicationMenu(menu); }, true); 

</script> 

electron menu API獲取更多信息和代碼段的以上是基於。我沒有真正測試代碼,但它應該概述一個解決方案。

與未來可能的解決方案的更多信息:

隨着2016年6月結束的,有兩種可能的解決方案下來的是目前正在開發由電子開發團隊行:

  1. 一可能會引入新事件,這是由剪貼板中的更改觸發的(GitHub issue
  2. 動態菜單是當前開發中的一個可能焦點(Github issue
+0

確實是這樣做的一種方法,但它不保證打開菜單時數據仍然有效。 – Schlaus

+0

的確如此。然而,Electron剪貼板api沒有變化事件([但是,這是一個關於這個主題的公開問題](https://github.com/electron/electron/issues/2280))和菜單api doesn'沒有一個用於onOpen ...這種方式限制了你的選擇,在當前的剪貼板上以一定的時間間隔來檢查當前剪貼板的內容,這在任何情況下都是不太理想的。 –

+0

除了剪貼板onchange事件,我還發現關於動態菜單的另一個關於電子的github問題,這似乎是未來解決問題的可能方法。 –