2016-02-12 58 views
2

我試圖在模塊級別訪問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

這是因爲你正試圖跳進奧裏利亞環境? –

回答

3

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進入之前,有一個簡單的輸入不起作用的原因? –