2013-03-16 12 views
12

私は、角度アプリにいくつかのウェブソケット機能を追加しています。 Websocketオブジェクトはサービスにラップされます。私たちは、次のようなコントローラで使用できるように、理想的には、標準イベントAPIを持っている私たちのラップソケットオブジェクトを希望: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 

私たちが達成するためのベストプラクティス/ライブラリは何ですか(CoffeeScriptのため申し訳ありませんが)この? jqueryを使用しますか?バックボーン。どんな提案も役に立ちます。ありがとう!

答えて

19

サービスを作成し、$ 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(); 
    }; 
}); 
+0

答えfastreloadありがとうございますが、これは私が必要とするものではありません。私の例では、コントローラーは自分自身のためだけにソケットメッセージの購読を解除する機能を持っています。別の文では、購読はコントローラーの細かさに基づいています - 各コントローラーは購読するタイミングと購読をいつ行うのかを決定できます。思考? – KailuoWang

+0

ああ、更新された私の答え –

+0

ありがとう、fastreload。それは悪い解決策ではありません。 – KailuoWang

関連する問題