如何在课堂外访问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! 
} 

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

+0

这是因为你正试图跳进奥里利亚环境? –

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

谢谢你。所以我的理解是,Aurelia DI框架创建一个注入到视图类中的单例(默认)实例。显然,这是在框架内部的某个地方进行跟踪的,所以我希望有一种方法可以访问该特定实例。之所以这样做,是因为我有意见通过更加习惯的Aurelia方法(即@inject)来订阅......但是想要发布一个浏览器事件,这个事件独立于Aurelia正在做的事情。 –

+0

有意义,更新回答 –

+0

Hrm,只要我将导入{EventAggregator} ...行添加到main.js,应用就会崩溃:404尝试获取..../dist/aureia-event-aggregator.js 。在Aurelia进入之前,有一个简单的输入不起作用的原因? –