Files
2015-12-10 16:41:57 -06:00

102 lines
2.2 KiB
TypeScript

import {Injectable} from 'angular2/core';
/**
* Events is a pub/sub style event system for sending and responding to application-level
* events across your app.
* @usage
* ```ts
* // first page (publish an event when a user is created)
* function createUser(user) {
* console.log('User created!')
* events.publish('user:created', user);
* }
*
* // second page (listen for the user created event)
* events.subscribe('user:created', (user) => {
* console.log('Welcome', user);
* });
*
* ```
*/
@Injectable()
export class Events {
constructor() {
this.channels = [];
}
/**
* Subscribe to an event topic. Events that get posted to that topic
* will trigger the provided handler.
*
* @param topic the topic to subscribe to
* @param handler the event handler
*/
subscribe(topic, ...handlers) {
if(!this.channels[topic]) {
this.channels[topic] = [];
}
handlers.forEach((handler) => {
this.channels[topic].push(handler);
});
}
/**
* Unsubscribe from the given topic. Your handler will
* no longer receive events published to this topic.
*
* @param topic the topic to unsubscribe from
* @param handler the event handler
*
* @return true if a handler was removed
*/
unsubscribe(topic, handler) {
let t = this.channels[topic];
if(!t) {
// Wasn't found, wasn't removed
return false;
}
if(!handler) {
// Remove all handlers for this topic
delete this.channels[topic];
return true;
}
// We need to find and remove a specific handler
let i = t.indexOf(handler);
if(i < 0) {
// Wasn't found, wasn't removed
return false;
}
t.splice(i, 1);
// If the channel is empty now, remove it from the channel map
if(!t.length) {
delete this.channels[topic];
}
return true;
}
/**
* Publish an event to the given topic.
*
* @param topic the topic to publish to
* @param eventData the data to send as the event
*/
publish(topic, ...args) {
var t = this.channels[topic];
if(!t) {
return null;
}
let responses = [];
t.forEach((handler) => {
responses.push(handler(args));
});
return responses;
}
}