There is a third parameter, $watch() , which will make it check the equality of the object (deep watch).
$scope.$watch('form', function(newVal) {
To complete my answer, both of these approaches lead to the same result in this case: Live demo here (click). but $watchCollection shallow and will not watch anything embedded in the changes.
$scope.$watch('form', function(newForm, oldForm) { console.log(newForm.name); }, true);
OR: (not deep hours)
$scope.$watchCollection('form', function(newForm, oldForm) { console.log(newForm.name); });
source share