代码之家  ›  专栏  ›  技术社区  ›  Don Tomato

角度和电子-主进程和渲染进程之间的IPC通信

  •  2
  • Don Tomato  · 技术社区  · 6 年前

    有小型号:

    export class SettingsModel {
      DbFileName: string;
    }
    

    主要流程:

    ipcMain.on('getSettings', function(event) {
        event.sender.send('resultSettings', 'Test settings');
    });
    

    IpcService:

    import { Injectable } from '@angular/core';
    import { ElectronService } from 'ngx-electron';
    
    @Injectable()
    export class IpcService {
      constructor(private _electronService: ElectronService) {}
    
      public on(channel: string, listener: Function): void {
        this._electronService.ipcRenderer.on(channel, listener);
      }
    
      public send(channel: string, ...args): void {
        this._electronService.ipcRenderer.send(channel, args);
      }
    }
    

    最后是角度分量:

    export class SettingsComponent {
      constructor(private _electronService: ElectronService, private _db: DbService, private _ipc: IpcService) {
        this.Settings = new SettingsModel();
        console.log("1:" + this.Settings)
        _ipc.send('getSettings');
        console.log("2:" + this.Settings)
        _ipc.on('resultSettings', this._updateSettings);
        console.log("3:" + this.Settings)
      }
    
      private _updateSettings(evt: any, result: string) {
        console.log("4:" + result);
        console.log("5:" + this.Settings);
        this.Settings.DbFileName = result;
      }
    
      Settings: SettingsModel;
    }
    

    结果铬日志:

    1:[object Object]
    2:[object Object]
    3:[object Object]
    4:Test settings
    5:undefined
    Uncaught TypeError: Cannot set property 'DbFileName' of undefined
    

    IPC似乎工作得很好,但由于某种原因,当我得到响应时,我有一个SettingsComponent类的不同实例。我不知道为什么以及如何管理它。有什么想法或建议吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Don Tomato    6 年前

    看起来问题与angular、Electron和IPC无关,而与TypeScript有关。

    public on(channel: string, listener: Function): void {
      this._electronService.ipcRenderer.on(channel, listener);
    }
    

    我必须使用箭头表达式 => :

    public on(channel: string, listener: Function): void {
      this._electronService.ipcRenderer.on(channel, (evt, args) => listener(evt, arg));
    }
    

    _ipc.on('resultSettings', (evt, args) => this._updateSettings(evt, args));