emitter.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. ///<reference path="../../headers/common.d.ts" />
  2. import {Subject} from 'vendor/npm/rxjs/Subject';
  3. var hasOwnProp = {}.hasOwnProperty;
  4. function createName(name) {
  5. return '$' + name;
  6. }
  7. export class Emitter {
  8. subjects: any;
  9. constructor() {
  10. this.subjects = {};
  11. }
  12. emit(name, data?) {
  13. var fnName = createName(name);
  14. this.subjects[fnName] || (this.subjects[fnName] = new Subject());
  15. this.subjects[fnName].next(data);
  16. }
  17. on(name, handler, scope?) {
  18. var fnName = createName(name);
  19. this.subjects[fnName] || (this.subjects[fnName] = new Subject());
  20. var subscription = this.subjects[fnName].subscribe(handler);
  21. if (scope) {
  22. scope.$on('$destroy', function() {
  23. subscription.unsubscribe();
  24. });
  25. }
  26. return subscription;
  27. };
  28. off(name, handler) {
  29. var fnName = createName(name);
  30. if (this.subjects[fnName]) {
  31. this.subjects[fnName].dispose();
  32. delete this.subjects[fnName];
  33. }
  34. }
  35. dispose() {
  36. var subjects = this.subjects;
  37. for (var prop in subjects) {
  38. if (hasOwnProp.call(subjects, prop)) {
  39. subjects[prop].dispose();
  40. }
  41. }
  42. this.subjects = {};
  43. }
  44. }