简体   繁体   English

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

[英]How to unregister from ipcRenderer.on event listener?

In my host application I have a button, that when clicked, sends data over to my angular application with data.在我的主机应用程序中,我有一个按钮,单击该按钮后,会将数据连同数据一起发送到我的 angular 应用程序。 Like so:像这样:

<button (click)="onClick()">Send Some Data</button>

component:成分:

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

In my angular application I am receiving data like so:在我的 angular 应用程序中,我收到的数据如下:

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)
        })
    }
  }
}

The behavior that I noticed was that for x time I click the button, I will see the alert x amount of times:我注意到的行为是,我点击按钮 x 次,我会看到警报 x 次:

  • 1 click --> 1 alert 1 次点击 --> 1 次警报
  • 2 click --> 2 alerts 2 单击 --> 2 个警报
  • 3 click --> 3 alerts.. etc etc 3 单击 --> 3 个警报.. 等等

So this obviously indicated to me that there is a memory leak.所以这显然向我表明存在 memory 泄漏。 The solution is straightforward, remove the event listener after it receives an event.解决方法很简单,在接收到事件后移除事件监听器。

I have tried doing something like:我试过做类似的事情:

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

But the multiple alerts still happens on a single click.但是多次警报仍然发生在一次点击上。

I cannot use the ipcRenderer.once method, since I need the listener to remain open, just not have multiple listeners of the same.我不能使用 ipcRenderer.once 方法,因为我需要监听器保持打开状态,只是没有多个相同的监听器。 How can I remove the ipcRenderer.on('data-bridge', ...) event listener, so that for every click of the button, I will only have one event listener?如何删除 ipcRenderer.on('data-bridge', ...) 事件侦听器,以便每次单击按钮时,我将只有一个事件侦听器?

ipcRenderer is an EventEmitter class, so you have removeListener(eventName, listener) (or off ) method on it. ipcRenderer是一个EventEmitter类,因此您具有removeListener(eventName, listener) (或off )方法。

This should work 这应该工作

// on construct
this.onData = (event, data) => {
  console.log('got something', data)
})
// on init
ipcRenderer.on('data-bridge', this.onData)
// on deconstruct
ipcRenderer.removeListener('data-bridge', this.onData)

the answer from @pergy didn't work for my electron, node.js,vue.js setup @pergy 的答案不适用于我的 electron、node.js、vue.js 设置

but this did the trick:但这成功了:

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

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

eventTargetRef.removeAllListeners('data-bridge')

ipcRenderer.on() returns a reference to the nodeEventTarget ipcRenderer.on()返回对 nodeEventTarget 的引用

removeAllListeners is a Node.js-specific extension to the EventTarget class. If type is specified, it removes all registered listeners for type, otherwise it removes all registered listeners. removeAllListeners是 EventTarget class 的特定于 Node.js 的扩展。如果指定了类型,它会删除该类型的所有已注册侦听器,否则会删除所有已注册的侦听器。

node documentation节点文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM