Как лучше всего выполнять разработку, управляемую событиями, в приложениях Angular.js?

Я добавляю некоторые функции веб-сокета в наше угловое приложение. Объект Websocket заключен в службу. В идеале мы хотели бы, чтобы наш обернутый объект сокета имел стандартный API событий, чтобы мы могли использовать его в контроллере следующим образом: (извините за Coffeescript)

angular.module('myApp').controller 'myCtrl', ($scope, socket) ->
  update = (msg)->
    $scope.apply ->
      #do something regarding to the msg

  socket.on 'message', update

  unregister: ->
    socket.off 'message', update  

Какова наилучшая практика/библиотека для достижения этого? Использовать jquery? Backbone.Events? Любое предложение будет полезно. Спасибо!


person KailuoWang    schedule 16.03.2013    source источник


Ответы (1)


Для этого вам не нужно использовать какую-либо библиотеку, просто создайте службу, введите $rootscope и опубликуйте оттуда события в rootscope, а затем в своем контроллере прослушайте это событие.

var socket; // this be the socketio instance.
angular.module("myApp").factory("SocketHandler", function ($rootScope) {
  var handler = function (msg) {
    $rootScope.$apply(function () {
      $rootScope.$broadcast("socketMessageReceived", msg);
    });
  };

  socket.on("message", handler);

  $rootScope.$on("unregisterSocket", function () {
    socket.off("message", handler);
  });
}).controller("myCtrl", function ($scope, SocketHandler) {
  var listener;
  var addListener = function () {
    listener = $scope.$on("messageReceived", function (e, msg) {
      console.log("New Message: " + msg);
    }); // $on returns a registration function for the listener
  };
  var removeListener = function () {
    if (listener) listener();
  };
});
person Umur Kontacı    schedule 16.03.2013
comment
Спасибо за ответ fastreload, однако это не совсем то, что мне нужно. В моем примере контроллер имеет возможность отписаться от сообщения сокета только для себя, в другом предложении подписка осуществляется на уровне контроллеров — каждый контроллер может решить, когда подписаться, а когда отписаться. Мысли? - person KailuoWang; 16.03.2013
comment
Спасибо, fastreload. Это неплохое решение. - person KailuoWang; 18.03.2013