【问题标题】:How to unregister from ipcRenderer.on event listener?如何从 ipcRenderer.on 事件监听器中注销?
【发布时间】:2019-12-16 12:19:13
【问题描述】:

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

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

组件:

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

在我的 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)
        })
    }
  }
}

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

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

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

我试过做类似的事情:

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

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

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

【问题讨论】:

标签: javascript node.js angular electron ipcrenderer


【解决方案1】:

ipcRenderer 是一个EventEmitter 类,所以你有removeListener(eventName, listener)(或off)方法。

这应该可以

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

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2015-04-07
    • 2019-02-25
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2013-05-22
    • 2019-08-01
    相关资源
    最近更新 更多