我正在尝试在模块级别而不是从类内部访问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!
}


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

最佳答案

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'));
}

10-06 07:59