32

I have yet another issue with minification. This time it's because of the $scope service passed to the directive's controller. See below code:

angular.module('person.directives').
directive("person", ['$dialog', function($dialog) {
return {
    restrict: "E",
    templateUrl: "person/views/person.html",
    replace: true,
    scope: {
        myPerson: '='
    },     
    controller: function ($scope)
    {                   
        $scope.test = 3;                   
    }
}
}]);

If I comment out the controller part, then it works fine.

As you can see, I've used the array declaration for the directive, so the $dialog service is known to Angular even after minification. But how am I supposed to do it for the $scope service on the controller ?

2 Answers 2

75

You need to declare a controller as follows:

controller: ['$scope', function ($scope)
    {                   
        $scope.test = 3;                   
    }]

Full example here:

angular.module('person.directives').
directive("person", ['$dialog', function($dialog) {
return {
    restrict: "E",
    templateUrl: "person/views/person.html",
    replace: true,
    scope: {
        myPerson: '='
    },     
    controller: ['$scope', function ($scope)
    {                   
        $scope.test = 3;                   
    }]
}
}]);

A solution provided by @Sam would work to but it would mean exposing directive's controller to the whole application which is unnecessary.

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

5 Comments

that's the solution provided by me :) Sam = OP ;-) However I'm not exposing the controller to the whole application, just to the whole module that the directive belongs to. I like your approach though, I'll go for that.
Actually exposing it to one AngularJS module would mean that any AngularJS module would have access to it - this is what I've meant by exposing it to the whole application.
AngularJS modules would have access to the person.controllers module only if they depend on it. If they don't have that dependency, they should not be able to access it. Isn't that right ?
Nope, in the current version of AngularJS those controllers would be available globally, in the whole application.
Great solution to wrap it like this... Thanks for this.
1

ok, I ended up creating the controller in a separate file :

angular.module('person.controllers').controller('personCtrl', ['$scope', function ($scope) {
$scope.test = 3;
}]);

then in the directive, I assign the controller by name:

controller: 'personCtrl'

Not sure it's the best way. It looks clean though. What do you think ?

1 Comment

This would work to but it would mean exposing directive's controller to the whole application which is unnecessary.

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.