如何在课堂外访问Aurelia EventAggregator?
我试图在模块级别访问Aurelia EventAggregator服务,而不是从类内部访问。它在一个班级内工作得很好,其中我是@inject
事件聚合器,但不在外面。如何在课堂外访问Aurelia EventAggregator?
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
class/constructor-function没有任何静态方法。 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'));
}
谢谢你。所以我的理解是,Aurelia DI框架创建一个注入到视图类中的单例(默认)实例。显然,这是在框架内部的某个地方进行跟踪的,所以我希望有一种方法可以访问该特定实例。之所以这样做,是因为我有意见通过更加习惯的Aurelia方法(即@inject)来订阅......但是想要发布一个浏览器事件,这个事件独立于Aurelia正在做的事情。 –
有意义,更新回答 –
Hrm,只要我将导入{EventAggregator} ...行添加到main.js,应用就会崩溃:404尝试获取..../dist/aureia-event-aggregator.js 。在Aurelia进入之前,有一个简单的输入不起作用的原因? –
这是因为你正试图跳进奥里利亚环境? –