@okozlovskyi

Как обновить данные в таблице после их изменения? AngularJS

Проблема с обновлением данных в таблице.
Данные получаю с сервера, и через некое время с вебсокета приходит уведобление, что какая-то записть была изменена, но сама запись в таблице не меняется. Как можно обновить таблицу? Обновляется только после рефреша страницы.
Данные получаю GET запросом.
Мои исходники:

Получаю вот так:
$http({
            method: 'GET',
            url: 'rest/api/get'
        }).success(function(data, status, header) {
            $scope.mydata = data;

        }).error(function(data, status, header) {
            console.log(status);
        });


Вывожу так:
<tr item="parameter" ng-repeat="item in mydata"  ng-show="item.status=='4' || item.status=='8' || item.status=='C'">
                          <td>{{item.id}}</td>
                          <td>{{item.type}}</td>
                          <td>{{item.status}}</td>
                          <td>{{item.price}}</td>                         
                      </tr>


Мой сервис для вебсокета:

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);
            var item = $.grep($scope.mydata, function(item) {
                return item.id == msg.id
            })
            if (item.length > 0) {
                item[0].status = msg.status
            } else {
                $scope.mydata.push(msg);
            }

            $scope.$apply();

        });
        $scope.getOrders();
        EventService.connect();
  • Вопрос задан
  • 3715 просмотров
Решения вопроса 1
maxaon
@maxaon
Вы не сообщаете ангуляру, что пришли данные, т.е. вы не запускаете digest цикл
Там где
if (obj.id) {
  setTimeout(function() {
    service.callback(obj);
  , 1000)
}

надо
$rootScope.apply(function(){
service.callback(obj);
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы