自己的控制器

时间:2016-10-20 11:30:14

标签: javascript angularjs events electron

我正在使用AngularJS编写的Electron App。在Electron应用程序的主要流程中,我正在收听DownloadItem事件。因此,每次用户下载文件时,都会触发事件。在我的Main.js中,我有以下代码。

  win.webContents.session.on('will-download', (event, item, webContents) => {
    item.once('done', (event, state) => {
    if (state === 'completed') {
      win.webContents.send('download-message', 'completed', item.getSavePath());
    } else if (state === 'interrupted') {
      win.webContents.send('download-message', 'failed');
    }
  })
});

在事物的角度方面,我正在"主要"等待这样的事件。控制器(代表应用程序的起点)。所以,这里有一些代码看起来像这样:

const { ipcRenderer } = require('electron');
ipcRenderer.on('download-message', function (event, method, filepath) {
    if (method === 'completed') {
    // Do something interesting
  } else if (method === 'failed') {
    // Do something interesting
  }
});

这很好用,但在主Application Controller中处理所有这些事件感觉有点难看。我想将它分离到自己的Controller(例如downloadController)。

我考虑过在自己的服务中监听这些事件(例如downloadsService),但由于我想操纵应用程序的视图(例如显示一些成功/失败消息),我不这么认为将是这个功能的正确位置。

因此,我正在寻找一种将此功能与特定控制器分开的好方法。

也许我只是不太了解Angular及其控制器的概念,所以任何建议都会非常有用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以在用于修改视图的控制器中处理事件。您只需确保处理事件的控制器与触发事件的控制器共享$ scope。

当您触发Angular事件时,您可以使用$ emit或$ broadcast。调用

$scope.$emit(name, args);

将在范围层次结构中向上发送事件,因此如果您有父控制器,它将听到有关该事件的信息。 $ broadcast向下发送事件。但是,如果您的控制器都在同一层级注册,则必须使用$ rootScope。

无论您使用$ rootScope还是$ scope,请确保将其注入正在侦听事件的控制器以及触发事件的控制器。