UPDATE (2015-04-10)
Angular has improved its code base (1.4.0), first try the $scope.$watchCollection and see if it works for you. ( Link )
ANSWER
If you don't like hacking into a third-party library, you can add hacking to your code using:
$scope.updateData = function() { var data = angular.copy($scope.myData); data.splice(data.length - 1, 1, {name: 'UPDATED', age: '4'}) $scope.myData = data; };
plunkr
As @Stewie mentions, the problem is that for performance reasons, ngGrid superficially compares the data object, and in the case of arrays, by reference. ngGrid also compared by the length of the array, so if the array does not change the length, the grid will not be updated.
This solution creates a copy of the array (another location in memory), so when angularjs $watcher checks for changes, it will find another object and run the ngGrid update ngGrid .
NOTE. . Since this solution creates a copy of the data array each time updateData called, it can lead to performance problems if your data is too large and Javascript does not have a lot of garbage collection.
Old wrong answer:
$timeout(angular.noop, 0);
It just sets a timeout to run $scope.$apply() after the current one has completed. A way to force a dirty check.
source share