Подтвердить что ты не робот

Angular.js: обновление модели не вызывает обновление

В настоящее время я работаю над веб-клиентом twitter, поэтому я использовал angular.js, node.js и socket.io. Я нажимаю новые твиты через socket.io моему клиенту, где служба ждет новых твитов. когда приходит новый твит, служба отправляет событие через $broadcast.

в моем контроллере есть прослушиватель событий, где входящие твиты обрабатываются отдельной функцией. эта функция просто подталкивает новый твит в моей области твита.

теперь, моя проблема ist, что мое представление не обновляется, но я вижу, как расширяется область. возможно, у вас есть идея, как я могу это решить?

дополнительно мой код:

службы:

(function () {
    app.factory('Push', ['$rootScope', function ($rootScope) {
        socket.on('new-tweet', function (msg) {
            $rootScope.$broadcast('new-tweet', msg);
        });
    }]);
}());

контроллер:

(function () {
    app.controller("StreamCtrl", function StreamCtrl ($scope, $rootScope, $http, Push) {
        $scope.tweets = [];

        $http
            .get('/stream')
            .then(function (res) {
                $scope.tweets = res.data;
            });

        $scope.addTweet = function (data) {
            $scope.tweets.push(data);
            console.log($scope.tweets);
        };

        $rootScope.$on('new-tweet', function (event, data) {
            if (!data.friends) {
                $scope.addTweet(data);
            }
        });
    });
}());

весь проект находится здесь: https://github.com/hochitom/node-twitter-client

4b9b3361

Ответ 1

Добавление ниже строки кода в addTweet и проблема будет решена

$scope.addTweet = function (data) {
            $scope.tweets.push(data);
            $scope.$apply();
            console.log($scope.tweets);
        };

Ответ 2

Я предпочитаю использовать $timeout (не забудьте добавить его к контроллеру) вместо $apply:

 app.controller("StreamCtrl", function StreamCtrl ($scope, $timeout $rootScope, $http, Push) {

    //...

    $scope.addTweet = function (data) {
        $timeout(function() {
            $scope.tweets.push(data);
            console.log($scope.tweets);
        });
    };

    //...

});