You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron/Angular13回调函数内调用注入服务报ipcRenderer未定义错误

问题原因

报错的核心是回调函数执行时this的上下文不是Angular组件实例:当你直接将handleStop绑定给mediaRecorder.onstop时,事件触发时this会指向mediaRecorder对象,而非你的组件,因此this._electronService会被判定为undefined。

解决方案

以下三种方法任选其一即可,注意要同时处理ondataavailable和onstop两个回调(handleDataAvailable也存在相同的this指向问题):

方案1:使用箭头函数包装回调

修改onSourceSelected中的事件绑定代码,用箭头函数包裹原方法,继承组件的this上下文:

async onSourceSelected(displayId: string) {
    // ... 原有代码省略 ...
    
    // 替换事件绑定逻辑
    this.mediaRecorder.ondataavailable = (e) => this.handleDataAvailable(e);
    this.mediaRecorder.onstop = (e) => this.handleStop(e);
};

方案2:在构造函数中绑定this

在组件构造函数里,将方法的this强制绑定到组件实例:

constructor(private dialogRef: DialogRef, @Inject(DIALOG_DATA) public data: any, private _electronService: ElectronApiServiceService, private zone: NgZone, private dialog: DialogService) { 
    // 绑定this到组件实例
    this.handleDataAvailable = this.handleDataAvailable.bind(this);
    this.handleStop = this.handleStop.bind(this);
}

之后原有的事件绑定代码无需修改,回调执行时this始终指向组件。

方案3:将方法定义为箭头函数类属性

直接把handleDataAvailable和handleStop定义为箭头函数形式的类属性,天然绑定组件的this:

// 替换原方法定义
handleDataAvailable = (e: any) => {
    this.recordChunks.push(e.data);
};

handleStop = async (e: any) => {
    const blob = new Blob(this.recordChunks, {
        type: 'video/webm; codecs=vp9'
    });
    
    const buffer = Buffer.from(await blob.arrayBuffer());
    console.log(buffer)

    this._electronService.ipcRenderer.send('stop-recording', buffer);
};

这种方式下,后续的事件绑定代码无需额外处理。

内容的提问来源于stack exchange,提问作者Haytham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:50:53