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