I don't understand the use of $inject in controllers

JavascriptAngularjsDependency Injection

Javascript Problem Overview


I am totally confused about inject in Angular. I do not know where to use it and why. Is it only used with factory as described here?

myController.$inject = ['$scope','notify'];

Here notify is the name of the factory.

Javascript Solutions


Solution 1 - Javascript

That is one approach to support Dependency Injection after your code is minified (if you choose to minify).

When you declare a controller, the function takes parameters:

function ($scope, notify)

When you minify the code, your function will look like this:

function (a, b)

Since AngularJS uses the function parameter names to infer DI, your code will break because AngularJS doesn't know about a or b.

To solve this problem, they provided additional ways to declare controllers (or other services/factories/etc) for that matter:

  1. For controllers, use the $inject method - here you pass an array of literals that map to the parameters of your controller function. So, if you provide

     ['$scope', 'notify']
    

then the value of the first parameter to your function will be the a scope object associated with this controller and the second parameter will be the notify service.

  1. When declaring new controllers, services, etc, you can use the array literal syntax. Here, you do something like this:

     angular.module('myModule').controller('MyController', ['$scope', 'notify', function ($scope, notify) {
         ...
     }]);
    

The array as a parameter to the controller function maps the DI objects to your function parameters.

I prefer Option #2 when declaring controllers etc as it is easier to read/understand/cross-check since it is all in the same place.

Solution 2 - Javascript

To complement @mark answer, it is important to note that using the $inject method in the style of:

MyController.$inject = ['$scope', 'notify'];

allows you to add injection dependencies when building providers which are the only angular recipes that don't allow 'friendly' annotation style i.e.:

.controller('MyController', ['$scope', 'notify',... 

dependencies to be declared.

Solution 3 - Javascript

The way you should use $inject is:

function ApplicationController($scope){
    $scope.greet = "Foo is Not Great!5";
}

ApplicationController.$inject = ['$scope','$ionic'];

app.controller('ApplicationController', ApplicationController);

We need to this as to protect the code from uglifying or minimization.

function(firstName,lastName) may get turned into function(n,m).

So for AngularJS it will break the code because $scope can be replaced by 's'. This is because without the $ sign the angularJS won't be able to recognize the code.

Solution 4 - Javascript

It's mandatory to use this format when we are having ng-strict-di attribute

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionunknownbitsView Question on Stackoverflow
Solution 1 - JavascriptMark SherrettaView Answer on Stackoverflow
Solution 2 - Javascriptnikk wongView Answer on Stackoverflow
Solution 3 - JavascriptPritam BanerjeeView Answer on Stackoverflow
Solution 4 - Javascriptuser1452840View Answer on Stackoverflow