Node.js Electron中上下文菜单的堆叠

Node.js Electron中上下文菜单的堆叠,node.js,menu,ipc,electron,atom-editor,Node.js,Menu,Ipc,Electron,Atom Editor,我正在构建一个基于电子的应用程序,它包含一个包含唯一行的网格。我想要一个特定于每一行的上下文菜单。以下是一个例子: 尽管此屏幕截图已裁剪,但您可以看到有多行,每行包含单独的数据。因为我想右键单击一行并获得一个唯一的上下文菜单,所以我实现了,它在第一次右键单击时起作用,但随后的右键单击会导致上下文菜单的堆叠效果 具体来说,发生的情况如下: 我右键单击第1行,相应的上下文菜单显示出来 我右键单击第2行,重复显示第1行的上下文菜单,然后显示第2行的上下文菜单。(请注意,屏幕截图中显示的关联菜单与我的

我正在构建一个基于电子的应用程序,它包含一个包含唯一行的网格。我想要一个特定于每一行的上下文菜单。以下是一个例子:

尽管此屏幕截图已裁剪,但您可以看到有多行,每行包含单独的数据。因为我想右键单击一行并获得一个唯一的上下文菜单,所以我实现了,它在第一次右键单击时起作用,但随后的右键单击会导致上下文菜单的堆叠效果

具体来说,发生的情况如下:

  • 我右键单击第1行,相应的上下文菜单显示出来
  • 我右键单击第2行,重复显示第1行的上下文菜单,然后显示第2行的上下文菜单。(请注意,屏幕截图中显示的关联菜单与我的鼠标所在的行不对应)
  • 这种情况一再发生
  • 在React.JS中,这是我的侦听器,它根据
    电子上下文菜单
    模块的需要收集
    上下文菜单
    对象:

      handleContextMenu() {
        this.props.contextMenu({
          window: electron.remote.BrowserWindow.getFocusedWindow(),
          prepend: (params, browserWindow) => [{
            label: `Library Compare ${this.state.msn}`,
            click: () => this.runLibCompare()
          }],
          append: (params, browserWindow) => [{
            label: '---',
          }]
        })
      };
    
    其中
    this.props.contextMenu(…)
    感知要输入的React.JS组件:

    const contextMenu = eRequire('electron-context-menu');
    
    我已经做了一些大规模的调试,我认为问题不在于模块。我使用的模块基本上组织了上下文菜单的信息,然后使用了
    electron.remote
    函数和来自electron内部的
    menu.popup
    函数。这里有一个链接到

    此调用
    菜单。弹出的
    将导致此操作

    }

    因此,我看到了对
    ipcdrender.sendSync
    的调用——但是,当我在
    ipcMain
    中添加调试语句时,我没有看到任何输出

    ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
      try {
        args = unwrapArgs(event.sender, args)
        let obj = objectsRegistry.get(id)
    
        if (obj == null) {
          throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`)
        }
    
        callFunction(event, obj[method], obj, args)
      } catch (error) {
        event.returnValue = exceptionToMeta(error)
      }
    })
    
    当我向上述函数添加调试语句时,我没有看到任何输出。这就是我的搜索有一堵墙的地方

    我用的是电子1.4.15。我知道这个问题应该是可以解决的,毕竟Atom IDE(基于电子的)没有这个问题,即使它有多个上下文菜单


    我想我需要清除一些内存,我就是不知道如何清除以前上下文菜单的堆栈

    我通过首先使用e.target获得点击的目标来解决这个问题。然后,根据这一点,我调用相应的contextmenu。如果目标命中不在我的应用程序的目标列表中,我将使用默认的上下文菜单

    window.addEventListener(
        "contextmenu",
        e => {
            e.preventDefault();
            if (e.target.id === 'fullscr'){
    
            console.log(e && e.target);
    
           // e.preventDefault();
            mymenu.popup(remote.getCurrentWindow());
            }else{
                editmenu.popup(remote.getCurrentWindow());
            }
            console.log(e.which);
        },
        false
    );  
    
    ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
      try {
        args = unwrapArgs(event.sender, args)
        let obj = objectsRegistry.get(id)
    
        if (obj == null) {
          throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`)
        }
    
        callFunction(event, obj[method], obj, args)
      } catch (error) {
        event.returnValue = exceptionToMeta(error)
      }
    })
    
    window.addEventListener(
        "contextmenu",
        e => {
            e.preventDefault();
            if (e.target.id === 'fullscr'){
    
            console.log(e && e.target);
    
           // e.preventDefault();
            mymenu.popup(remote.getCurrentWindow());
            }else{
                editmenu.popup(remote.getCurrentWindow());
            }
            console.log(e.which);
        },
        false
    );