что бы angular понял что данные нужно синхронизировать, нужно запустить у $scope либо $apply (проверяет на изменения все от $rootScope и вниз по иерархии) либо $digest (обновляет текущий и дочерние скоупы).
Вообще как это должно выглядеть:
angular.module('app')
.factory('myApi', function ($http, $q) {
return {
list: function () {
return $http.get('/points').then(function (response) {
return response.data;
}, function () {
return $q.reject(); // произошла какая-то ошибка
});
},
add: function (point) {
return $http.post('/points', data).then(function (response) {
if (201 === response.status) { // если на сервере все сохранилось удачно
return response.data;
}
return $q.reject(); // как-то не удалось
}, function () {
return $q.reject();
});
}
}
})
.controller('MyCtrl', function ($scope, myApi) {
myApi.list().then(function (points) {
$scope.points = points;
}); // было бы неплохо еще и ошибки как-то обрабатывать
$scope.add = function () {
myApi.add({...}).then(function (item) {
$scope.points.push(item);
});
}
});
Это как пример. Когда $http завершит запрос, этот сервис запустит digest цикл (так как на него завязаны промисы, без вызова $apply/$digest промисы так же не отработают сразу. Так что при таком варианте скоуп всегда будет в актуальном состоянии.
Если у вас какое-то действие меняет что-то в $scope по событию - нужно вручную вызывать $scope.$apply или $scope.$digest. Причем лучше сделать так:
// перед вызовом функции, переданной в $apply,
// приложение синхронизирует свое состояние
// Это позволяет гарантировать то, что в на момент вызова функции
// отработают все ватчеры и внесут возможные изменения
// Это эдакий безопасный способ
$scope.$apply(function () {
// chage scope
$scope.points = []; // меняем...
});
Если же у вас подменяется коллекция на ту же, то не отработает ватчер, не обновится таблица.