scope.$watch: listen to a simple scope change

scope.$watch is used to observe changes on the scope and trigger callbacks when such changes occur
Problem: changing some scope model outside of a scope life cycle
Solution: use scope.$apply() with a simple expression
Alternative solution: use scope.$apply() with a function
Problem: element.on() and scope changes propagation not happening
Solution: scope.$apply()
Problem: not using a real model on the scope leads to scope inheritance issues
Solution: use an object with properties to keep the reference