By default, Angular creates a scope object (most commonly referred to as the $scope variable) for each HTML template.
scope: { selectedOption: '='}, in your code, it actually creates a scope isolated for the directive and makes the selectedOption property for this scope object.
The controllerAs: 'ctrl' creates a property for the same scope object that points to the controller object.
This actually means that in the controller you could technically access ctrl.$parent.selectedOption , which will return the selectedOption property of the parent ctrl object, which is equal to scope . In practice, however, this is very cumbersome.
Angular 1.3 adds the new bindToController : true option bindToController : true . This parameter automatically binds the properties from the scope: definition to the controllerAs: object instead of scope .
source share