2013-03-16 42 views
12

我正在爲我們的角度應用添加一些websocket功能。 Websocket對象被包裝在一個服務中。理想情況下,我們希望我們的包裝Socket對象有一個標準事件API,這樣我們就可以像下面的控制器使用方法:(對不起,我的CoffeeScript)在Angular.js應用程序中進行事件驅動開發的最佳做法是什麼?

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?任何建議都會有幫助。謝謝!

回答

19

您不需要使用任何庫來實現這一點,只需創建一個服務,注入$ rootscope並將事件從那裏發佈到rootcope,然後在您的控制器中監聽該事件。

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(); 
    }; 
}); 
+0

謝謝你的答案fastreload,但這並不完全是我所需要的。在我的例子中,控制器有能力只爲自己取消訂閱套接字消息,在另一句話中,訂閱是以控制器的粒度爲基礎的 - 每個控制器都可以決定何時訂閱以及何時取消訂閱。思考? – KailuoWang 2013-03-16 16:57:25

+0

哦,那麼,更新我的答案 – 2013-03-16 17:28:05

+0

感謝fastreload。這不是一個糟糕的解決方案。 – KailuoWang 2013-03-18 19:42:52

相關問題