带socket.io的自动更新角度工厂

时间:2014-08-06 15:48:21

标签: angularjs socket.io angularjs-service

我正在尝试使用角度工厂为我的控制器提供共享状态。我也希望这个工厂通过监听websocket自动更新其状态。目标是我可以在一个地方编写我的数据获取逻辑,然后让UI组件自动更新。

我遇到的问题是,当工厂自行更新时,控制器永远不会看到更新。以下是我正在尝试做的一个例子:

app.factory('Socket', function () {
    var Socket = io.connect();
    return Socket;
});

app.factory('UpdateCounter', ['Socket', function (Socket) {
    var counter = 0;
    Socket.on('update', function () {
        counter += 1;
    });
    return counter;
}]);
app.controller('MyController', ['$scope','UpdateCounter', function ($scope,UpdateCounter) {
    $scope.counter = UpdateCounter;
    ...
}]);

MyController将看到UpdateCounter = 0并且永远不会看到更改。

我并不感到惊讶,这不起作用,但我不知道为什么它不起作用;我也不知道自己应该做些什么来获得我需要的行为。

2 个答案:

答案 0 :(得分:0)

您需要告诉Angular已发生更新。

app.factory('UpdateCounter', ['Socket', '$rootScope', function (Socket, $rootScope) {
    var counter = 0;
    Socket.on('update', function () {
        counter += 1;
        $rootScope.$apply();
    });
    return counter;
}]);

答案 1 :(得分:0)

有几种方法可以做到这一点。第一个也是简单的是添加一个手表,以便控制器知道观察变化的价值。

app.controller('MyController', ['$scope','UpdateCounter', function ($scope,UpdateCounter) {
    $scope.$watch(function(){
        return UpdateCounter;
    }, function(newVal){
        $scope.counter = newVal;
    })
}]);

第二种也许更好的方法是返回一个可以引用的对象

app.factory('UpdateCounter', ['Socket', function (Socket) {
    var counter = { count: 0 };

    Socket.on('update', function () {
        counter.count += 1;
    });
    return counter;
}]);

app.controller('MyController', ['$scope','UpdateCounter', function ($scope,UpdateCounter) {
    $scope.counter = UpdateCounter;
}]);

在您的视图中,您可以引用counter.count来获取计数,它将自动更新。