In this case (as mentioned in the answers) you can use $timeout instead of setTimeout . But in all cases, you can use $scope.$apply() to change the $ frame, which is outside the $ digest loop.
window.setTimeout(function () { $scope.greeting = "hello"; $scope.$apply(); }, 3000);
source share