+ All Categories
Home > Technology > Modules and injector

Modules and injector

Date post: 09-Jan-2017
Category:
Upload: eyal-vardi
View: 6,941 times
Download: 0 times
Share this document with a friend
21
Modules & Injector Eyal Vard Site: Angular.org. Blog: eyalvardi.wordpress.c
Transcript
Page 1: Modules and injector

Modules & Injector

Eyal VardiSite: Angular.org.ilBlog: eyalvardi.wordpress.com

Page 2: Modules and injector

Module Function

angular

Modules (private)

angular.module( 'moduleName' , [ ] ) angular.module( 'moduleName' )

moduleName

Create Module: Get Module:

Page 3: Modules and injector

JavaScript Files Dependency

<html lang="en" ng-app="myTodo"> <body> ... <script src="lib/angular.js"></script> <!-- My Modules --> <script src="js/app.js"></script> <script src="js/controllers.js"></script>

</body></html>

// app.js file must to be firstangular.module('myTodo',[]);

// controllers.js must to be after app.jsangular.module('myTodo');

Page 4: Modules and injector

Module Object

angular.module('myApp', ['bl']) // Name (key) and value (function) .controller('MainCtrl',MainCtrl) .directive ('tabs',tabsDirective) .provider('proxy',proxyProvider) // Functions only .config(function(proxyProvider){…}) .run(function(proxy){…});

name : 'myApp' requires : [ 'bl']

_runBlocks : [ ]

_configBlocks : [ ]

_invokeQueue : [ ]

'MainCtrl',MainCtrl'tabs',tabsDirective

'proxy',proxyProvider

function(proxyProvider){…}function(proxy){…}

Page 5: Modules and injector

Module Object name : string requires : [ ]

_runBlocks : [ ]run( initializationFn )

_configBlocks : [ ]Config(function( xxxProvider ){ })

_invokeQueue : [ ] - controller(name, constructor)- directive (name, directiveFn)- filter (name, filterFactory)- animation (name, animationFactory)

- service (name, constructor)- factory (name, providerFn)- provider (name, providerType)- decorator(name, fn )

- constant (name, object)- value (name, object)

Page 6: Modules and injector

angular

Modules (private)

Modules CreationBrowser

<html lang="en" ng-app="app"> <body> <div class="view-container"> <div ng-view class="view-frame"></div> </div> <script src="lib/angular.js"></script> <!-- Angular Modules --> <script src="lib/angular-route.js"></script> <!-- My Modules --> <script src="js/app.js"></script> <script src="js/controllers.js"></script> <script src="js/services.js"></script> </body></html>

ngRoute app

ctrls services

DOM Content Loaded Event

Page 7: Modules and injector

When DOMContentLoaded Event Fire angular start to work !!!

Page 8: Modules and injector

AngularJS Codevar injector = createInjector(modules);

injector.invoke([

'$rootScope','$rootElement','$compile','$injector','$animate',

function(scope, element, compile, injector, animate) {

scope.$apply(function() {

element.data('$injector', injector);

compile(element)(scope);

});

}]

);

Create the injector and load the modules to the injector.

1

Compile the root element and return link function.

2 Execute the link function with the root scope.

3

Apply, update

the page

4

Page 9: Modules and injector

1. Create Injectorangular

Modules (private)

ngRoute app

ctrls services

$injector (Instance Injector)

Provider Injector

Instance Cache

Provider CacheKeys Values

Invoke( )get( )

Keys Values

instantiate( ) has( )

Invoke( )get( ) instantiate( ) has( )

Page 10: Modules and injector

2. Modules Treeangular

Modules (private)

ngRoute

app

ctrls

services

<!-- app.js -->angular.module('app',['ngRoute','ctrls']) .config(function($routeProvider){});

<!-- angular-route.js -->angular.module('ngRoute',[]) .provider('$route',fn);

<!-- controllers.js -->angular.module('ctrls',['services']) .controller('MainCtrl', fn);

<!-- services.js -->angular.module('services',[]) .service('todoSer', fn);

<html lang="en" ng-app="app">

Page 11: Modules and injector

3. Load Modulesangular

Modules (private)

ngRoute

app

services

Provider Injector

Keys Values

todoSer

{ $get : factoryFn }

$controllerProviderKeys Values

constructor

$route

{ $get : factoryFn }

config

ctrlsMainCtrl

{ $get : factoryFn }

todoSerProvider

$routeProvider

Page 12: Modules and injector

angular

4. Load Modules Finish

$injector

Provider Injector

Instance Cache

Provider CacheKeys Values

{ $get : factoryFn }

{ $get : factoryFn }

todoSerProvider

$routeProvider

Invoke( )get( )

Keys Values

instantiate( ) has( )

Invoke( )get( ) instantiate( ) has( )

Page 13: Modules and injector

angular

5. Run State

Provider Injector

Instance Cache

Provider CacheKeys Values

{ $get : factoryFn }

{ $get : factoryFn }

todoSerProvider

$routeProvider

angular.module('app',['ngRoute','ctrls'] .run(function runFn(todoSer){ todoSer.load(); });

Invoke( runFn )get( 'todoSer' )

get( 'todoSer' + 'Provider' )

Keys Values{ . . .}todoSer

Page 14: Modules and injector

ngXXX

Module Summaryangular.module('myApp', ['ngXXX', 'ngYYY']);

InvokeQueue

ngYYY

InvokeQueue

myApp

InvokeQueue

Configblocks

Configblocks

Configblocks

Runblocks

Runblocks

Runblocks

$injector

Instance Cache

ProviderCache

Page 15: Modules and injector

The Real Magic of The Injector // You write functions such as this one.function doSomething(serviceA, serviceB) { // do something here.} // Angular provides the injector for your applicationvar $injector = ...;

$injector.invoke(doSomething);

var serviceA = $injector.get('serviceA'); var serviceB = $injector.get('serviceB'); doSomething(serviceA, serviceB);

=

Page 16: Modules and injector

Minified Problem

// inline option$injector.invoke( [ 'serviceA', function (serviceA) { } ] );

$injector.invoke( function (serviceA) { } );

$injector.invoke( function ( sa ) { } );

minified

xxx.js

xxx.min.js

Solutions

// annotated optionexplicit.$inject = ['serviceA'];function explicit(serviceA) { };$injector.invoke(explicit);

Page 17: Modules and injector

ng-strict-di The injector will be created in "strict-di"

mode. The application will fail to invoke functions

which do not use explicit function annotation<ANY ng-app="angular.Module" [ng-strict-di="boolean"]>

... </ANY>

Useful for debugging info, will assist in tracking down the root of these bugs.

Page 18: Modules and injector

Error Messages (1/2)

Uncaught Error: [$injector:modulerr] Failed to instantiate module. This error occurs when a module fails to load

due to some exception.

<html lang="en" ng-app="app"> <body> <script src="lib/angular.js"></script>

<script src="lib/angular-route.js"></script> <script src="js/app.js"></script> </body></html>

angular.module('app', ['ngRoute']);

The module file are being downloaded correctly

The module name in the requires is not misspelled

Page 19: Modules and injector

Error Messages (2/2)

Error: [$injector:unpr] Unknown provider. Error: [ng:areq] Argument 'MainCtrl' is not a

function, got undefined.

<html lang="en" ng-app="app">

<body ng-controller="Ctrl">

<script src="angular.js"></script>

<script src="angular-route.js"></script> <script src="app.js"></script> </body></html>

angular.module('app', ['ngRoute']).controller('Ctrl', function(){...});

The module, where the provider / controller is defined, is loaded to the injector

Spelled correctly

Page 20: Modules and injector

Thankseyalvardi.wordpress.com

Eyal VardiSite: Angular.org.ilBlog: eyalvardi.wordpress.com

Page 21: Modules and injector

StartupHTML

Browser

StaticDOM

DynamicDOM

(View)

AngularJSDOM

Content Loaded Event

ng-app=“module”

$injector

$compile $rootScope

$compile (dom,

$rootScope)


Recommended