Comment intégrer Electron ipcRenderer dans L'application Angular 2 basée sur le Typographie?

je veux utiliser ipcMain/ipcRenderer sur mon projet de communiquer de L'angle à L'électron et de retour.

Les Électrons secondaires est assez clair:

const
  electron = require('electron'),
  ipcMain = electron.ipcMain,
;

ipcMain.on('asynchronous-message', function(event, arg) {
  console.debug('ipc.async', arg);
  event.sender.send('asynchronous-reply', 'async-pong');
});

ipcMain.on('synchronous-message', function(event, arg) {
  console.debug('ipc.sync', arg);
  event.returnValue = 'sync-pong';
});

mais je n'ai aucune idée de comment intégrer ce module électronique dans mon application angulaire 2. J'utilise SystemJS comme chargeur de module, mais je suis un débutant avec.

Toute aide appréciée. Grâce.

- - - Mario

17
demandé sur Sommereder 2016-03-29 17:00:22

5 réponses

il y a conflit, parce que Electron utiliser commonjs module de résolution de problèmes, mais votre code déjà compilé avec systemjs règles.

deux solutions:

Robuste. Enregistrer l'objet require retourné:

<script>
    System.set('electron', System.newModule(require('electron')));
</script>

C'est le meilleur, parce que renderer/init.js script charge ce module au démarrage. Les systèmes ne doivent prendre que ça, pas les charges.

Alternative . Utilisation sale tour à la déclaration.

Obtenir de l'électron exemple à l'intérieur d' index.html:

<script>
    var electron = require('electron');
</script>

le Déclarer à l'intérieur de votre typescript le fichier de cette façon:

declare var electron: any;

l'Utiliser avec la liberté )

electron.ipcRenderer.send(...)
15
répondu DenisKolodin 2016-05-21 08:44:29

un paquet récent appelé ngx-electron rend cela facile. Lien vers le repo et lien vers l'article

src/app / app.module.ts

import { NgxElectronModule } from 'ngx-electron';
// other imports 
@NgModule({
  imports: [NgxElectronModule],
  ...
})

src/app/votre.composant.ts

import { Component, NgZone } from '@angular/core';
import { ElectronService } from 'ngx-electron';

@Component({
  selector: 'app-your',
  templateUrl: 'your.component.html'
})
export class YourComponent {
    message: string;        

    constructor(private _electronService: ElectronService, private _ngZone: NgZone) { 
        this._electronService.ipcRenderer.on('asynchronous-reply', (event, arg) => {
            this._ngZone.run(() => {
                let reply = `Asynchronous message reply: ${arg}`;
                this.message = reply;
            });
        }
    }

    playPingPong() {
        this._electronService.ipcRenderer.send('asynchronous-message', 'ping');
    }
}

Remarque: NgZone parce que this.message est mis à jour de façon asynchrone à l'extérieur de la zone D'Angular. article

11
répondu user3587412 2017-02-28 15:29:34

mais je n'ai aucune idée comment intégrer ce module électronique dans mon application 2 angulaire

Vous avez angular hébergé dans le processus de rendu de L'interface utilisateur en électron. ipcMain est utilisé pour communiquer à des processus enfants non rendus.

2
répondu basarat 2016-03-29 22:44:31

cela devrait juste être un cas d'exiger le ipcRenderer module dans votre fichier html principal (electron vous le fournira):

<script>
  var ipc = require('electron').ipcRenderer;
  var response = ipc.sendSync('getSomething');
  console.log(response); // prints 'something'
</script>

et ensuite configurer un handler dans votre fichier JS principal:

const ipcMain = require('electron').ipcMain;
ipcMain.on('getSomething', function(event, arg) {
  event.returnValue = 'something';
});

C'est tout ce qu'il devrait être.

1
répondu KarlPurk 2016-03-30 14:51:21

ma solution:

configurer un baseUrl dans tsconfig.json

à la racine du répertoire pointé par la baseUrl, créer un répertoire "électron". A l'intérieur de ce répertoire, un index de fichier.ts:

const electron = (<any>window).require('electron');

export const {BrowserWindowProxy} = electron;
export const {desktopCapturer} = electron;
export const {ipcRenderer} = electron;
export const {remote} = electron;
export const {webFrame} = electron;

(idéalement exporter par défaut [...] ("électron"), mais il n'est pas possible de l'analyser statiquement...)

maintenant, je peux avoir dans mon moteur de rendu processus:

import {remote} from 'electron';
console.log(remote);

Espérons que cela a du sens...

avec typings activé:

///<reference path="../../typings/globals/electron/index.d.ts"/>
const electron = (<any>window).require('electron');

export const BrowserWindowProxy = <Electron.BrowserWindowProxy>electron.BrowserWindowProxy;
export const desktopCapturer = <Electron.DesktopCapturer>electron.desktopCapturer;
export const ipcRenderer = <Electron.IpcRenderer>electron.ipcRenderer;
export const remote = <Electron.Remote>electron.remote;
export const webFrame = <Electron.WebFrame>electron.webFrame;

NB: typographies I got is from:

{
  "globalDependencies": {
    "electron": "registry:dt/electron#1.4.8+20161220141501"
  }
}
0
répondu Charles HETIER 2016-12-30 13:55:56