Angular + Websockets +数据呈现

时间:2014-06-06 19:31:38

标签: javascript angularjs websocket

我有使用Websockets的应用程序。 在服务器更改一些数据后,我从websocket获得一些消息后发生了什么更改,需要更新表中的数据。我从websocket获取数据,发送获取数据的GET请求,并使用数据更新我的范围,但我没有看到表中的更改。 在 $ scope.ordersList 中,我保存了从服务器发出的日期。

我的websockets服务:

var services = angular.module('services', []);
services.factory('EventService', ['$cookies',
    function($cookies) {
        var service = {};
        service.connect = function() {
            if (service.ws) {
                return;
            }
            var ws = new WebSocket("ws://" + window.location.host + "/events/");

            ws.onopen = function() {
                ws.send(JSON.stringify({
                    type: "auth",
                    token: $cookies.token
                }));
                console.log("Succeeded to open a conection");
            };
            ws.onerror = function() {
                console.log("Failed to open a connection");
            };
            ws.onmessage = function(message) {
                var obj = JSON.parse(message.data);
                if (obj.result) return;

                if (obj.id) {
                    setTimeout(function() {
                        service.callback(obj);
                    }, 1000)
                }
            };
            service.ws = ws;
        };
        service.subscribe = function(callback) {
            service.callback = callback;
        };
        return service;
    }
]);

我如何在我的控制器中使用它:

EventService.subscribe(function(msg) {

            console.log('msg', msg);
            var item = $.grep($scope.ordersList, function(item) {
                return item.id == msg.id
            })
            if (item.length > 0) {
                item[0].status = msg.status
            } else {
                $scope.ordersList.push(msg);
            }

            $scope.$apply();

        });
        $scope.getOrders();
        EventService.connect();

我的模板:

<tr item="parameter" ng-repeat="item in ordersList">
<td>{{item.id}}</td>
<td>{{item.symbol}}</td>
</tr>

1 个答案:

答案 0 :(得分:1)

您需要将service.callback包装在$ rootScope.apply中,以使其进入angulars摘要周期。选中此项以获取概念:http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/