在角度控制器中监听文档事件

时间:2014-02-21 05:52:48

标签: javascript angularjs

如何捕捉角度控制器中的事件?

我有文档级事件,所以我需要在角度控制器中捕获事件,是否可能?

更新

我有独立的js文件,处理来自相机的一些操作。

document.addEventListener('myCameraEvent', handleMyCameraEvent);

我想在角度控制器或指令中触发此事件。任何人都可以解释一下,如何用angular实现?

1 个答案:

答案 0 :(得分:2)

这是一个通用的自定义事件观察服务:

.service('Camera', function($document) {

  //map of current subscribers
  var subscribers = {};

 //notifies all subscribers of particular event type
 function notify(event) {
    var handlers = subscribers[event.type] || [];
    for (var i = 0; i < handlers.length; i++) {
      handlers(i)(event);
    }
  }
  //adds new handler to subscribers list
  //returns object with unsubscribe() method
  this.subscribe(eventType, handler) {
     var handlers = subscribers[eventType] || [];
     handlers.push(handler);
     return (function(type, index) {
       return {
         unsubscribe: function() {
           subscribers[type].splice(index);
         }
       }
     })(eventType, handlers.length - 1);
  }

  //register custom events
  $document.on('myCameraEvent', function(event) {
    notify(event);
  });

  $document.on('myOtherCameraEvent', function(event) {
    notify(event);
  });

});

在您的控制器中,您可以像这样使用它:

.controller('MyCtrl', function($scope, Camera) {
  subscriber = Camera.subscribe('myCustomEvent', customEventHandler);
  function customEventHandler(event) {
    //process event
    //..

    //if handler is not needed anymore, unsubscribe
    //subscriber.unsubscribe();
  }

})

当然,这只是一般性的想法。您可能希望在Camera服务上使用特定方法,例如Camera.onSnapshot(snapshothandler); Camera.onTurnOff(turnOffHandler);,它会将处理程序注册到特定事件以抽象出事件名称。