2

I was reading a very interesting resource and I stumbled across this piece of code:

angular
    .module('app')
    .directive('myExample', myExample);

function myExample() {
    var directive = {
        restrict: 'EA',
        templateUrl: 'app/feature/example.directive.html',
        scope: {
            max: '='
        },
        link: linkFunc,
        controller: ExampleController,
        controllerAs: 'vm',
        bindToController: true // because the scope is isolated
    };
    return directive;

    function linkFunc(scope, el, attr, ctrl) {
        console.log('LINK: scope.min = %s *** should be undefined', scope.min);
        console.log('LINK: scope.max = %s *** should be undefined', scope.max);
        console.log('LINK: scope.vm.min = %s', scope.vm.min);
        console.log('LINK: scope.vm.max = %s', scope.vm.max);
    }
}

ExampleController.$inject = ['$scope'];

function ExampleController($scope) {
    // Injecting $scope just for comparison
    var vm = this;
    vm.min = 3;
    console.log('CTRL: $scope.vm.min = %s', $scope.vm.min);
    console.log('CTRL: $scope.vm.max = %s', $scope.vm.max);
    console.log('CTRL: vm.min = %s', vm.min);
    console.log('CTRL: vm.max = %s', vm.max);
}

What got most of my curiosity was the

console.log('LINK: scope.max = %s *** should be undefined', scope.max);

in the directive's link function. I don't understand why scope.max should be undefined. vm is defined in the controller, so why does the max attribute – which is directly defined in the directive's isolate scope – must be accessed through it on the link function? Is it related to using the controller as syntax on the directive?

1 Answer 1

3

I think it's the bindToController option that is the important bit here. It binds the isolate scope variables to the controller rather than the scope. Thus, there is no max property on the scope, just on the controller instance. This controller instance is then assigned to a property on the $scope when you use controllerAs so, in your example, you would see vm as a property on your $scope object if you were to log it in the console for example.

You can read more about bindToController in the $compile section in the docs: https://docs.angularjs.org/api/ng/service/$compile

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.