Let's say I have made a module with a service and a controller in Angular.js, I am able to access that service inside of the controller like so:
var myapp = angular.module('my-app', []);
myapp.factory('Service', function() {
var Service = {};
Service.example = 'hello';
//etc..
return Service;
});
myapp.controller('mainController', function($scope, Service) {
$scope.greeting= Service.example;
});
In this example, the Service object will be passed to the controller, and structuring the code like so will not change the behavior of the code:
myapp.controller('mainController', function(Service, $scope) {
$scope.greeting= Service.example;
});
so, how does Angular.js "know" what the function arguments mean?
In AngularJS, a Controller is defined by a JavaScript constructor function that is used to augment the AngularJS Scope. Controllers can be attached to the DOM in different ways.
In AngularJS, $scope is the application object (the owner of application variables and functions). The controller creates two properties (variables) in the scope (firstName and lastName). The ng-model directives bind the input fields to the controller properties (firstName and lastName).
Nested Controllers: AngularJS allows using nested controllers. It means that you have specified a controller in an HTML element which is a child of another HTML element using another controller.
ng-controller directive tells AngularJS what controller to use with this view. AngularJS application mainly relies on controllers to control the flow of data in the application.
Angular simply parses the toString()
representation of the function for the names of dependencies. From the docs:
In JavaScript calling
toString()
on a function returns the function definition. The definition can then be parsed and the function arguments can be extracted.
However, note that this approach will fail if your code is minified. For that reason, Angular supports an alternative (I would suggest always using it) syntax, using an array:
myapp.controller('mainController', ["$scope", "Service", function($scope, Service) {
$scope.greeting= Service.example;
}]);
This is accomplished by the quite clever method annotate
(source) which takes a regex scan on function signature source (using function.toString()
) and iteratively pushes each function argument into the function $inject
array.
The same result is accomplished when manually specifying the $inject
array as in:
var MyController = function($scope, myService) {
// ...
}
// Define function dependencies
MyController.$inject = ['$scope', 'myCustomService'];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With