电子菜单更改项目动态标签

时间:2018-04-16 09:36:08

标签: javascript electron contextmenu

我无法找到更改上下文菜单标签的方法。我想根据我右键单击的节点类型更改标签。

我试过这个没有成功:

$('#region-sortable').bind('contextmenu', function (e) {
      e.preventDefault();
      liRegionSelectionne = e.target;
      if(liRegionSelectionne.tagName.toLowerCase() == "span"){
        menuEditRegion.items[0].label = "Modifier cette Remarque";
      }else{
        menuEditRegion.items[0].label = "Modifier cette Région";
      }     
        menuEditRegion.popup(remote.getCurrentWindow());
    }); 

我可以在控制台中看到标签在对象items[0]中被更改,但是当菜单弹出时,标签是我最初声明菜单时放置的标签。

3 个答案:

答案 0 :(得分:1)

在GitHub上打开一个问题后,答案是实际上菜单不是动态的,可能不会很长时间。

请参阅https://github.com/electron/electron/issues/12633

答案 1 :(得分:0)

我自己遇到过这个问题,想要从渲染器进程中更改菜单。我创建了ipc-flux来处理这个问题。它类似于vuex通量模式。

从那里,在主进程中创建一个操作,将特定菜单标签更改为有效负载中提供的字符串。

然后从渲染器进程

发送它
$('#region-sortable').bind('contextmenu', function (e) {
    e.preventDefault();
    liRegionSelectionne = e.target;
    if(liRegionSelectionne.tagName.toLowerCase() == "span"){
        ipcFlux.dispatch('main', 'menuItemsLabelChange', 'Modifier cetter Remarque');
    } else{
        ipcFlux.dispatch('main', 'menuItemsLabelChange', 'Modifier cetter Région');
    }     
    menuEditRegion.popup(remote.getCurrentWindow());
}); 

答案 2 :(得分:0)

我会做这样的事情:(如果有人需要)

const menuTemplate = [{
    label: 'Options',
    submenu: [
       {
         label: 'Menu label',
         click() { //do stuff }
       }
    ]
}];

// Change menu items when user login. Fetching value from renderer process
ipcMain.on('logged-in', (event, args) => {
    if (args !== true) {
        return;
    }

    // Modify menu item status
    menuTemplate[0].submenu[0].label = 'New label';

    // Rebuild menu
    const menu = Menu.buildFromTemplate(menuTemplate);
    Menu.setApplicationMenu(menu);
});