我试图在模块级别而不是从类内部访问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!
}
那么如何在模块中访问该服务器的实例?我是否应该尝试这样做?
答案 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'));
}