如何在课堂外访问Aurelia EventAggregator?

时间:2016-02-12 07:42:53

标签: javascript aurelia

我试图在模块级别而不是从类内部访问Aurelia EventAggregator服务。它在一个类中工作正常,我@inject事件聚合器,但不在外面。

import {inject} from 'aurelia-framework';
import {EventAggregator} from 'aurelia-event-aggregator';

@inject(EventAggregator)
export class PingerClass {

  constructor(eventAggregator) {
    this.EA = eventAggregator;
  }

  ClassPing() {
    this.EA.publish('ping','Ping from class');
    // ^--- this works fine!
  }
}

function ModulePing() {
  EventAggregator.publish('ping','Ping from module');
  // ^-------- this doesn't work!
}

那么如何在模块中访问该服务器的实例?我是否应该尝试这样做?

1 个答案:

答案 0 :(得分:3)

EventAggregator类/构造函数没有任何静态方法。 EventAggregator.publish(...无法工作。您需要EventAggregator的实例,并且需要使用相同的实例进行发布和订阅(多个事件聚合器实例可以存在于同一个应用程序中)。

主要问题是混合依赖注入(@inject)模式与全局模式是棘手的。一种选择是将DI从图片中删除:

import {EventAggregator} from 'aurelia-event-aggregator';

const bus = new EventAggregator();    

export function publishPing() {
  bus.publish('ping','Ping from module');
}

export function subscribePing(callback) {
  return bus.subscribe('ping', callback);
}

我说的是你带着" PingerClass"的路线。将是一种更为惯用的Aurelia方法。

还有一个mixin会将EventAggregator API表面添加到任何对象:https://github.com/aurelia/event-aggregator/blob/master/src/index.js#L133

修改

让我们假设您要使用事件聚合器发布事件以响应浏览器事件。以下是您将如何做到这一点:

<强> main.js

import {EventAggregator} from 'aurelia-event-aggregator';

export function configure(aurelia) {
  ... standard aurelia main.js configure code ...

  let ea = aurelia.container.get(EventAggregator); // get or create the singleton instance managed by the container.
  addEventListener('beforeunload', event => ea.publish('some event', 'some payload'));
}