$watchCollection is working fine with me.
You mention you are using jQuery promise if you are using third party library in angular. Angular may not know $scope is updated.
you should use $scope.$apply.
for example
$.get(...).then(function(data){
$scope.$apply(function(){
$scope.data = data
})
})