[英]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 次:
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 的扩展。如果指定了类型,它会删除该类型的所有已注册侦听器,否则会删除所有已注册的侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.