如何从 ipcRenderer.on 事件监听器注销?

Kod*_*_12 3 javascript node.js electron angular ipcrenderer

在我的主机应用程序中,我有一个按钮,单击该按钮时,会将数据发送到我的角度应用程序。就像这样:

<button (click)="onClick()">Send Some Data</button>
Run Code Online (Sandbox Code Playgroud)

成分:

onClick() {  
ipcRenderer.send("data-bridge",{name: 'John Smith', address: 'Main Street', date: new Date() );
}
Run Code Online (Sandbox Code Playgroud)

在我的角度应用程序中,我收到如下数据:

import { ElectronService } from 'ngx-electron';

export class AppComponent {
  constructor( private electronService: ElectronService) {}

   ngOnInit() {
    if (this.electronService.ipcRenderer) {

      this.electronService.ipcRenderer.on('data-bridge', (event, data) => {
            console.log('got something', data)
        })
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我注意到的行为是,点击按钮 x 次,我将看到警报 x 次:

  • 1 次点击 --> 1 次警报
  • 2 次点击 --> 2 次警报
  • 3次点击--> 3次警报..等等

所以这显然向我表明存在内存泄漏。解决方案很简单,在接收到事件后删除事件监听器。

我尝试过做类似的事情:

this.electronService.ipcRenderer.on('data-bridge', (event, data) => {
        alert('got something');
        this.electronService.ipcRenderer.removeAllListeners()
}
Run Code Online (Sandbox Code Playgroud)

但多次警报仍然会在单击一次时发生。

我无法使用 ipcRenderer.once 方法,因为我需要监听器保持打开状态,只是没有多个相同的监听器。如何删除 ipcRenderer.on('data-bridge', ...) 事件侦听器,以便每次单击按钮时,我只有一个事件侦听器?

小智 6

@pergy 的答案不适用于我的电子、node.js、vue.js 设置

但这成功了:

this.onData = (event, data) => {
   console.log('got something', data)
})

let eventTargetRef = ipcRenderer.on('data-bridge', this.onData)

eventTargetRef.removeAllListeners('data-bridge')
Run Code Online (Sandbox Code Playgroud)

ipcRenderer.on()返回对 nodeEventTarget 的引用

removeAllListeners是 EventTarget 类的特定于 Node.js 的扩展。如果指定了 type,它将删除所有已注册的 type 侦听器,否则将删除所有已注册的侦听器。

节点文档