diff --git a/docs/app/assets/img/AngularJS-small.png b/docs/app/assets/img/AngularJS-small.png index ab5e20f883c1..eb08948b6e5b 100644 Binary files a/docs/app/assets/img/AngularJS-small.png and b/docs/app/assets/img/AngularJS-small.png differ diff --git a/docs/app/assets/img/bullet.png b/docs/app/assets/img/bullet.png index 3575a8e60f48..33280db2e501 100644 Binary files a/docs/app/assets/img/bullet.png and b/docs/app/assets/img/bullet.png differ diff --git a/docs/app/src/search.js b/docs/app/src/search.js index 1be6614f3846..c239e5d5675c 100644 --- a/docs/app/src/search.js +++ b/docs/app/src/search.js @@ -67,6 +67,12 @@ angular.module('search', []) clearResults(); $scope.q = ''; }; + + $scope.handleResultClicked = function($event) { + if ($event.which === 1 && !$event.ctrlKey && !$event.metaKey) { + $scope.hideResults(); + } + }; }]) diff --git a/docs/config/services/deployments/production.js b/docs/config/services/deployments/production.js index 7d92001e2e1d..7a8cace0d53e 100644 --- a/docs/config/services/deployments/production.js +++ b/docs/config/services/deployments/production.js @@ -7,22 +7,23 @@ var angularCodeUrl = '//code.angularjs.org/'; var cdnUrl = googleCdnUrl + versionInfo.cdnVersion; -// The "examplesCdnUrl" here applies to the examples when they are opened in plnkr.co. +// The "examplesDependencyPath" here applies to the examples when they are opened in plnkr.co. // The embedded examples instead always include the files from the *default* deployment, // to ensure that the source files are always available. // The plnkr examples must always use the code.angularjs.org source files. // We cannot rely on the CDN files here, because they are not deployed by the time // docs.angularjs.org and code.angularjs.org need them. -var examplesDependencyPath = versionInfo.currentVersion.isSnapshot ? - (angularCodeUrl + 'snapshot') : - (angularCodeUrl + (versionInfo.currentVersion.version || versionInfo.currentVersion.version)); +var versionPath = versionInfo.currentVersion.isSnapshot ? + 'snapshot' : + (versionInfo.currentVersion.version || versionInfo.currentVersion.version); +var examplesDependencyPath = angularCodeUrl + versionPath + '/'; module.exports = function productionDeployment(getVersion) { return { name: 'production', examples: { commonFiles: { - scripts: [examplesDependencyPath + '/angular.min.js'] + scripts: [examplesDependencyPath + 'angular.min.js'] }, dependencyPath: examplesDependencyPath }, diff --git a/docs/config/templates/app/indexPage.template.html b/docs/config/templates/app/indexPage.template.html index e779942cc115..3a543381f9b5 100644 --- a/docs/config/templates/app/indexPage.template.html +++ b/docs/config/templates/app/indexPage.template.html @@ -132,7 +132,7 @@

{{ key }}

diff --git a/docs/img/One_Way_Data_Binding.png b/docs/img/One_Way_Data_Binding.png index 60e7e3bf3255..f3f8ae6ddd8b 100644 Binary files a/docs/img/One_Way_Data_Binding.png and b/docs/img/One_Way_Data_Binding.png differ diff --git a/docs/img/Two_Way_Data_Binding.png b/docs/img/Two_Way_Data_Binding.png index 3a9c6d1ecc25..e5f5e79bf400 100644 Binary files a/docs/img/Two_Way_Data_Binding.png and b/docs/img/Two_Way_Data_Binding.png differ diff --git a/docs/img/angular_parts.png b/docs/img/angular_parts.png index a33a10ba7db5..5fee18e75b22 100644 Binary files a/docs/img/angular_parts.png and b/docs/img/angular_parts.png differ diff --git a/docs/img/form_data_flow.png b/docs/img/form_data_flow.png index 60e947a59583..03b9fc897848 100644 Binary files a/docs/img/form_data_flow.png and b/docs/img/form_data_flow.png differ diff --git a/docs/img/guide/concepts-databinding1.png b/docs/img/guide/concepts-databinding1.png index 87b7ffd0bfea..90243b6c6aad 100644 Binary files a/docs/img/guide/concepts-databinding1.png and b/docs/img/guide/concepts-databinding1.png differ diff --git a/docs/img/guide/concepts-databinding2.png b/docs/img/guide/concepts-databinding2.png index be8cbafe298d..30cd08cf55a8 100644 Binary files a/docs/img/guide/concepts-databinding2.png and b/docs/img/guide/concepts-databinding2.png differ diff --git a/docs/img/guide/concepts-directive.png b/docs/img/guide/concepts-directive.png index b77d5f8ec98e..01e886cf29bd 100644 Binary files a/docs/img/guide/concepts-directive.png and b/docs/img/guide/concepts-directive.png differ diff --git a/docs/img/guide/concepts-module-injector.png b/docs/img/guide/concepts-module-injector.png index 31fcf84c626e..4e62fdd19779 100644 Binary files a/docs/img/guide/concepts-module-injector.png and b/docs/img/guide/concepts-module-injector.png differ diff --git a/docs/img/guide/concepts-runtime.png b/docs/img/guide/concepts-runtime.png index eededc2ab617..8f7732081f96 100644 Binary files a/docs/img/guide/concepts-runtime.png and b/docs/img/guide/concepts-runtime.png differ diff --git a/docs/img/guide/concepts-scope-watch-strategies.png b/docs/img/guide/concepts-scope-watch-strategies.png index 370a5f4ec22a..7fa83381f100 100644 Binary files a/docs/img/guide/concepts-scope-watch-strategies.png and b/docs/img/guide/concepts-scope-watch-strategies.png differ diff --git a/docs/img/guide/concepts-startup.png b/docs/img/guide/concepts-startup.png index b896a2b51697..40511a62d15b 100644 Binary files a/docs/img/guide/concepts-startup.png and b/docs/img/guide/concepts-startup.png differ diff --git a/docs/img/guide/concepts-view.png b/docs/img/guide/concepts-view.png index 0222544bee8f..e146e4e07eda 100644 Binary files a/docs/img/guide/concepts-view.png and b/docs/img/guide/concepts-view.png differ diff --git a/docs/img/guide/crisis-detail.png b/docs/img/guide/crisis-detail.png index 48f037a95085..2f4ccd464777 100644 Binary files a/docs/img/guide/crisis-detail.png and b/docs/img/guide/crisis-detail.png differ diff --git a/docs/img/guide/crisis-list.png b/docs/img/guide/crisis-list.png index a6fbbaa2e3ea..bab5391f3bb7 100644 Binary files a/docs/img/guide/crisis-list.png and b/docs/img/guide/crisis-list.png differ diff --git a/docs/img/guide/di_sequence_final.png b/docs/img/guide/di_sequence_final.png index d4d743bdbc88..3cfdf1bfc942 100644 Binary files a/docs/img/guide/di_sequence_final.png and b/docs/img/guide/di_sequence_final.png differ diff --git a/docs/img/guide/hashbang_vs_regular_url.jpg b/docs/img/guide/hashbang_vs_regular_url.jpg index 632b4febad28..eef7d2fe6aa3 100644 Binary files a/docs/img/guide/hashbang_vs_regular_url.jpg and b/docs/img/guide/hashbang_vs_regular_url.jpg differ diff --git a/docs/img/guide/hero-detail.png b/docs/img/guide/hero-detail.png index babcedaae8a6..d20ea82b42a4 100644 Binary files a/docs/img/guide/hero-detail.png and b/docs/img/guide/hero-detail.png differ diff --git a/docs/img/guide/heroes-list.png b/docs/img/guide/heroes-list.png index bb7143c7949d..15f18e712ae9 100644 Binary files a/docs/img/guide/heroes-list.png and b/docs/img/guide/heroes-list.png differ diff --git a/docs/img/guide/scenario_runner.png b/docs/img/guide/scenario_runner.png index a39037a0aa38..75ae8f7a16e7 100644 Binary files a/docs/img/guide/scenario_runner.png and b/docs/img/guide/scenario_runner.png differ diff --git a/docs/img/guide/simple_scope_final.png b/docs/img/guide/simple_scope_final.png index 99a04797a5d4..b4ce8f27e5e0 100644 Binary files a/docs/img/guide/simple_scope_final.png and b/docs/img/guide/simple_scope_final.png differ diff --git a/docs/img/tutorial/catalog_screen.png b/docs/img/tutorial/catalog_screen.png index 0b1968c5fb28..7f699ec8ab7d 100644 Binary files a/docs/img/tutorial/catalog_screen.png and b/docs/img/tutorial/catalog_screen.png differ diff --git a/docs/img/tutorial/tutorial_00.png b/docs/img/tutorial/tutorial_00.png index 65f3973eba00..55863d54c77d 100644 Binary files a/docs/img/tutorial/tutorial_00.png and b/docs/img/tutorial/tutorial_00.png differ diff --git a/docs/img/tutorial/tutorial_02.png b/docs/img/tutorial/tutorial_02.png index 95e3b4825636..68b9141a4fd6 100644 Binary files a/docs/img/tutorial/tutorial_02.png and b/docs/img/tutorial/tutorial_02.png differ diff --git a/docs/img/tutorial/tutorial_03.png b/docs/img/tutorial/tutorial_03.png index e71d001f5c81..e30082983c3d 100644 Binary files a/docs/img/tutorial/tutorial_03.png and b/docs/img/tutorial/tutorial_03.png differ diff --git a/docs/img/tutorial/tutorial_05.png b/docs/img/tutorial/tutorial_05.png index 97ce61472b12..d348041d4839 100644 Binary files a/docs/img/tutorial/tutorial_05.png and b/docs/img/tutorial/tutorial_05.png differ diff --git a/docs/img/tutorial/tutorial_06.png b/docs/img/tutorial/tutorial_06.png index 1a2403480f35..078d1457ad1e 100644 Binary files a/docs/img/tutorial/tutorial_06.png and b/docs/img/tutorial/tutorial_06.png differ diff --git a/docs/img/tutorial/tutorial_09.png b/docs/img/tutorial/tutorial_09.png index cd6bd000cb2b..a82740656c44 100644 Binary files a/docs/img/tutorial/tutorial_09.png and b/docs/img/tutorial/tutorial_09.png differ diff --git a/docs/img/tutorial/tutorial_10.png b/docs/img/tutorial/tutorial_10.png index 5a1d4ada6b5c..358cb5846487 100644 Binary files a/docs/img/tutorial/tutorial_10.png and b/docs/img/tutorial/tutorial_10.png differ diff --git a/docs/img/tutorial/tutorial_12.png b/docs/img/tutorial/tutorial_12.png index f6ad9ecff42a..f7cadfc2d575 100644 Binary files a/docs/img/tutorial/tutorial_12.png and b/docs/img/tutorial/tutorial_12.png differ diff --git a/images/docs/Diagrams.graffle/image1.png b/images/docs/Diagrams.graffle/image1.png index 565f406dd147..f4b997b37d43 100644 Binary files a/images/docs/Diagrams.graffle/image1.png and b/images/docs/Diagrams.graffle/image1.png differ diff --git a/images/docs/Diagrams.graffle/image2.png b/images/docs/Diagrams.graffle/image2.png index 6e52db7cfd48..a7c35290616d 100644 Binary files a/images/docs/Diagrams.graffle/image2.png and b/images/docs/Diagrams.graffle/image2.png differ diff --git a/images/docs/Diagrams.graffle/image4.png b/images/docs/Diagrams.graffle/image4.png index 6f118cd08754..43ed656d977e 100644 Binary files a/images/docs/Diagrams.graffle/image4.png and b/images/docs/Diagrams.graffle/image4.png differ diff --git a/images/docs/Diagrams.graffle/image9.png b/images/docs/Diagrams.graffle/image9.png index 606ea9eba46b..d9c04b0ccee1 100644 Binary files a/images/docs/Diagrams.graffle/image9.png and b/images/docs/Diagrams.graffle/image9.png differ diff --git a/images/docs/Diagrams.svg/image1.png b/images/docs/Diagrams.svg/image1.png index 565f406dd147..f4b997b37d43 100644 Binary files a/images/docs/Diagrams.svg/image1.png and b/images/docs/Diagrams.svg/image1.png differ diff --git a/images/docs/Diagrams.svg/image2.png b/images/docs/Diagrams.svg/image2.png index 6e52db7cfd48..a7c35290616d 100644 Binary files a/images/docs/Diagrams.svg/image2.png and b/images/docs/Diagrams.svg/image2.png differ diff --git a/images/docs/Diagrams.svg/image4.png b/images/docs/Diagrams.svg/image4.png index 6f118cd08754..43ed656d977e 100644 Binary files a/images/docs/Diagrams.svg/image4.png and b/images/docs/Diagrams.svg/image4.png differ diff --git a/images/docs/Diagrams.svg/image9.png b/images/docs/Diagrams.svg/image9.png index 606ea9eba46b..d9c04b0ccee1 100644 Binary files a/images/docs/Diagrams.svg/image9.png and b/images/docs/Diagrams.svg/image9.png differ diff --git a/images/docs/guide/concepts.graffle/image1.png b/images/docs/guide/concepts.graffle/image1.png index ae8d209e64f6..bac2e74264ce 100644 Binary files a/images/docs/guide/concepts.graffle/image1.png and b/images/docs/guide/concepts.graffle/image1.png differ diff --git a/images/docs/guide/concepts.graffle/image4.png b/images/docs/guide/concepts.graffle/image4.png index 83cebe66cd58..cbee9a0b9194 100644 Binary files a/images/docs/guide/concepts.graffle/image4.png and b/images/docs/guide/concepts.graffle/image4.png differ diff --git a/images/docs/guide/concepts.graffle/image5.png b/images/docs/guide/concepts.graffle/image5.png index 696cb3de2a89..7d461d73926a 100644 Binary files a/images/docs/guide/concepts.graffle/image5.png and b/images/docs/guide/concepts.graffle/image5.png differ diff --git a/images/docs/guide/concepts.svg/image4.png b/images/docs/guide/concepts.svg/image4.png index 83cebe66cd58..cbee9a0b9194 100644 Binary files a/images/docs/guide/concepts.svg/image4.png and b/images/docs/guide/concepts.svg/image4.png differ diff --git a/images/docs/guide/concepts.svg/image5.png b/images/docs/guide/concepts.svg/image5.png index 696cb3de2a89..7d461d73926a 100644 Binary files a/images/docs/guide/concepts.svg/image5.png and b/images/docs/guide/concepts.svg/image5.png differ diff --git a/images/docs/guide/simple_scope.graffle/image7.png b/images/docs/guide/simple_scope.graffle/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/guide/simple_scope.graffle/image7.png and b/images/docs/guide/simple_scope.graffle/image7.png differ diff --git a/images/docs/guide/simple_scope.svg/image7.png b/images/docs/guide/simple_scope.svg/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/guide/simple_scope.svg/image7.png and b/images/docs/guide/simple_scope.svg/image7.png differ diff --git a/images/docs/tutorial/simple_scope.graffle/image7.png b/images/docs/tutorial/simple_scope.graffle/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/tutorial/simple_scope.graffle/image7.png and b/images/docs/tutorial/simple_scope.graffle/image7.png differ diff --git a/images/docs/tutorial/simple_scope.svg/image7.png b/images/docs/tutorial/simple_scope.svg/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/tutorial/simple_scope.svg/image7.png and b/images/docs/tutorial/simple_scope.svg/image7.png differ diff --git a/images/docs/tutorial/tutorial_02.graffle/image11.png b/images/docs/tutorial/tutorial_02.graffle/image11.png index 30541dc6a02c..7033bfb5a998 100644 Binary files a/images/docs/tutorial/tutorial_02.graffle/image11.png and b/images/docs/tutorial/tutorial_02.graffle/image11.png differ diff --git a/images/docs/tutorial/tutorial_02.svg/image11.png b/images/docs/tutorial/tutorial_02.svg/image11.png index b661c139b65a..a83e9e7f82ea 100644 Binary files a/images/docs/tutorial/tutorial_02.svg/image11.png and b/images/docs/tutorial/tutorial_02.svg/image11.png differ diff --git a/images/docs/tutorial/tutorial_03.svg/image11.png b/images/docs/tutorial/tutorial_03.svg/image11.png index b661c139b65a..a83e9e7f82ea 100644 Binary files a/images/docs/tutorial/tutorial_03.svg/image11.png and b/images/docs/tutorial/tutorial_03.svg/image11.png differ diff --git a/images/docs/tutorial/tutorial_05.graffle/image13.png b/images/docs/tutorial/tutorial_05.graffle/image13.png index 6a467a14149f..ea504f2efa2b 100644 Binary files a/images/docs/tutorial/tutorial_05.graffle/image13.png and b/images/docs/tutorial/tutorial_05.graffle/image13.png differ diff --git a/images/docs/tutorial/tutorial_05.svg/image13.png b/images/docs/tutorial/tutorial_05.svg/image13.png index d73301a02d12..36efa9c3e589 100644 Binary files a/images/docs/tutorial/tutorial_05.svg/image13.png and b/images/docs/tutorial/tutorial_05.svg/image13.png differ diff --git a/images/docs/tutorial/tutorial_06.graffle/image15.png b/images/docs/tutorial/tutorial_06.graffle/image15.png index e30bc5182f23..02266b348c7f 100644 Binary files a/images/docs/tutorial/tutorial_06.graffle/image15.png and b/images/docs/tutorial/tutorial_06.graffle/image15.png differ diff --git a/images/docs/tutorial/tutorial_06.svg/image15.png b/images/docs/tutorial/tutorial_06.svg/image15.png index c712f85d6695..c364579ba55f 100644 Binary files a/images/docs/tutorial/tutorial_06.svg/image15.png and b/images/docs/tutorial/tutorial_06.svg/image15.png differ diff --git a/images/docs/tutorial/tutorial_09.graffle/image9.png b/images/docs/tutorial/tutorial_09.graffle/image9.png index 96782d0fb4d5..10f8d932251f 100644 Binary files a/images/docs/tutorial/tutorial_09.graffle/image9.png and b/images/docs/tutorial/tutorial_09.graffle/image9.png differ diff --git a/images/docs/tutorial/tutorial_09.svg/image9.png b/images/docs/tutorial/tutorial_09.svg/image9.png index a903171417e6..9e4131330682 100644 Binary files a/images/docs/tutorial/tutorial_09.svg/image9.png and b/images/docs/tutorial/tutorial_09.svg/image9.png differ diff --git a/images/docs/tutorial/tutorial_10.graffle/image10.png b/images/docs/tutorial/tutorial_10.graffle/image10.png index 8b80d67cddd4..c32a25ddf444 100644 Binary files a/images/docs/tutorial/tutorial_10.graffle/image10.png and b/images/docs/tutorial/tutorial_10.graffle/image10.png differ diff --git a/images/docs/tutorial/tutorial_10.svg/image10.png b/images/docs/tutorial/tutorial_10.svg/image10.png index 298ab9c5db86..59e4946e8da9 100644 Binary files a/images/docs/tutorial/tutorial_10.svg/image10.png and b/images/docs/tutorial/tutorial_10.svg/image10.png differ diff --git a/images/docs/tutorial/tutorial_12.graffle/image10.png b/images/docs/tutorial/tutorial_12.graffle/image10.png index 8b80d67cddd4..c32a25ddf444 100644 Binary files a/images/docs/tutorial/tutorial_12.graffle/image10.png and b/images/docs/tutorial/tutorial_12.graffle/image10.png differ diff --git a/images/docs/tutorial/tutorial_12.svg/image10.png b/images/docs/tutorial/tutorial_12.svg/image10.png index 298ab9c5db86..59e4946e8da9 100644 Binary files a/images/docs/tutorial/tutorial_12.svg/image10.png and b/images/docs/tutorial/tutorial_12.svg/image10.png differ diff --git a/images/docs/tutorial/tutorial_proto.graffle/image7.png b/images/docs/tutorial/tutorial_proto.graffle/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/tutorial/tutorial_proto.graffle/image7.png and b/images/docs/tutorial/tutorial_proto.graffle/image7.png differ diff --git a/images/docs/tutorial/tutorial_proto.svg/image7.png b/images/docs/tutorial/tutorial_proto.svg/image7.png index 3a9618137f85..6d3ff1c228c7 100644 Binary files a/images/docs/tutorial/tutorial_proto.svg/image7.png and b/images/docs/tutorial/tutorial_proto.svg/image7.png differ diff --git a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-huge.png b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-huge.png index 4aba796a7b12..b007c359d40d 100644 Binary files a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-huge.png and b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-huge.png differ diff --git a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-large.png b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-large.png index 68fe30784b2e..4c06d4ba8ca3 100644 Binary files a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-large.png and b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-large.png differ diff --git a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-medium.png b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-medium.png index d0962aa7cf80..5ff7d7f0701c 100644 Binary files a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-medium.png and b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-medium.png differ diff --git a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-small.png b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-small.png index a9a2d4564d60..c313fa033f68 100644 Binary files a/images/logo/AngularJS-Shield.exports/AngularJS-Shield-small.png and b/images/logo/AngularJS-Shield.exports/AngularJS-Shield-small.png differ diff --git a/images/logo/AngularJS.exports/AngularJS-huge.png b/images/logo/AngularJS.exports/AngularJS-huge.png index c7d717ddc13a..6a93a1cfc22c 100644 Binary files a/images/logo/AngularJS.exports/AngularJS-huge.png and b/images/logo/AngularJS.exports/AngularJS-huge.png differ diff --git a/images/logo/AngularJS.exports/AngularJS-large.png b/images/logo/AngularJS.exports/AngularJS-large.png index 7fce7b087d00..13eb7a7f66f7 100644 Binary files a/images/logo/AngularJS.exports/AngularJS-large.png and b/images/logo/AngularJS.exports/AngularJS-large.png differ diff --git a/images/logo/AngularJS.exports/AngularJS-medium.png b/images/logo/AngularJS.exports/AngularJS-medium.png index 1b30f2da5fbd..0333bafd467c 100644 Binary files a/images/logo/AngularJS.exports/AngularJS-medium.png and b/images/logo/AngularJS.exports/AngularJS-medium.png differ diff --git a/images/logo/AngularJS.exports/AngularJS-small.png b/images/logo/AngularJS.exports/AngularJS-small.png index c2c95a62795a..af48f8935ca8 100644 Binary files a/images/logo/AngularJS.exports/AngularJS-small.png and b/images/logo/AngularJS.exports/AngularJS-small.png differ diff --git a/images/logo/AngularJS.graffle/image1.png b/images/logo/AngularJS.graffle/image1.png index 119e24ad4b95..31e650fabc5a 100644 Binary files a/images/logo/AngularJS.graffle/image1.png and b/images/logo/AngularJS.graffle/image1.png differ diff --git a/images/logo/AngularJS.graffle/image2.png b/images/logo/AngularJS.graffle/image2.png index cd8575773008..bc0136e39fe6 100644 Binary files a/images/logo/AngularJS.graffle/image2.png and b/images/logo/AngularJS.graffle/image2.png differ diff --git a/src/auto/injector.js b/src/auto/injector.js index f45dc12bf5f0..b3567cfb0c6b 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -337,7 +337,46 @@ function annotate(fn, strictDi, name) { * * @returns {Array.} The names of the services which the function requires. */ - +/** + * @ngdoc method + * @name $injector#loadNewModules + * + * @description + * + * **This is a dangerous API, which you use at your own risk!** + * + * Add the specified modules to the current injector. + * + * This method will add each of the injectables to the injector and execute all of the config and run + * blocks for each module passed to the method. + * + * If a module has already been loaded into the injector then it will not be loaded again. + * + * * The application developer is responsible for loading the code containing the modules; and for + * ensuring that lazy scripts are not downloaded and executed more often that desired. + * * Previously compiled HTML will not be affected by newly loaded directives, filters and components. + * * Modules cannot be unloaded. + * + * You can use {@link $injector#modules `$injector.modules`} to check whether a module has been loaded + * into the injector, which may indicate whether the script has been executed already. + * + * ## Example + * + * Here is an example of loading a bundle of modules, with a utility method called `getScript`: + * + * ```javascript + * app.factory('loadModule', function($injector) { + * return function loadModule(moduleName, bundleUrl) { + * return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); }); + * }; + * }) + * ``` + * + * @param {Array=} mods an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + */ /** @@ -701,6 +740,11 @@ function createInjector(modulesToLoad, strictDi) { instanceInjector.strictDi = strictDi; forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); }); + instanceInjector.loadNewModules = function(mods) { + forEach(loadModules(mods), function(fn) { if (fn) instanceInjector.invoke(fn); }); + }; + + return instanceInjector; //////////////////////////////////// diff --git a/test/auto/injectorSpec.js b/test/auto/injectorSpec.js index 2e272b356a1e..7f5254e201e6 100644 --- a/test/auto/injectorSpec.js +++ b/test/auto/injectorSpec.js @@ -19,7 +19,7 @@ describe('injector.modules', function() { .info({ version: '1.2' }) .provider('test', ['$injector', function($injector) { providerInjector = $injector; - return { $get: function() {} }; + return {$get: function() {}}; }]); module('test1'); // needed to ensure that the provider blocks are executed @@ -152,6 +152,164 @@ describe('injector', function() { expect($injector).not.toBe(providerInjector); })); + + describe('loadNewModules', function() { + it('should be defined on $injector', function() { + var injector = createInjector([]); + expect(injector.loadNewModules).toEqual(jasmine.any(Function)); + }); + + it('should allow new modules to be added after injector creation', function() { + angular.module('initial', []); + var injector = createInjector(['initial']); + expect(injector.modules['initial']).toBeDefined(); + expect(injector.modules['lazy']).toBeUndefined(); + angular.module('lazy', []); + injector.loadNewModules(['lazy']); + expect(injector.modules['lazy']).toBeDefined(); + }); + + it('should execute runBlocks of new modules', function() { + var log = []; + angular.module('initial', []).run(function() { log.push('initial'); }); + var injector = createInjector(['initial']); + log.push('created'); + + angular.module('a', []).run(function() { log.push('a'); }); + injector.loadNewModules(['a']); + expect(log).toEqual(['initial', 'created', 'a']); + }); + + it('should execute configBlocks of new modules', function() { + var log = []; + angular.module('initial', []).config(function() { log.push('initial'); }); + var injector = createInjector(['initial']); + log.push('created'); + + angular.module('a', [], function() { log.push('config1'); }).config(function() { log.push('config2'); }); + injector.loadNewModules(['a']); + expect(log).toEqual(['initial', 'created', 'config1', 'config2']); + }); + + it('should execute runBlocks and configBlocks in the correct order', function() { + var log = []; + angular.module('initial', [], function() { log.push(1); }) + .config(function() { log.push(2); }) + .run(function() { log.push(3); }); + var injector = createInjector(['initial']); + log.push('created'); + + angular.module('a', [], function() { log.push(4); }) + .config(function() { log.push(5); }) + .run(function() { log.push(6); }); + injector.loadNewModules(['a']); + expect(log).toEqual([1, 2, 3, 'created', 4, 5, 6]); + }); + + it('should load dependent modules', function() { + angular.module('initial', []); + var injector = createInjector(['initial']); + expect(injector.modules['initial']).toBeDefined(); + expect(injector.modules['lazy1']).toBeUndefined(); + expect(injector.modules['lazy2']).toBeUndefined(); + angular.module('lazy1', ['lazy2']); + angular.module('lazy2', []); + injector.loadNewModules(['lazy1']); + expect(injector.modules['lazy1']).toBeDefined(); + expect(injector.modules['lazy2']).toBeDefined(); + }); + + it('should execute blocks of new modules in the correct order', function() { + var log = []; + angular.module('initial', []); + var injector = createInjector(['initial']); + + angular.module('lazy1', ['lazy2'], function() { log.push('lazy1-1'); }) + .config(function() { log.push('lazy1-2'); }) + .run(function() { log.push('lazy1-3'); }); + angular.module('lazy2', [], function() { log.push('lazy2-1'); }) + .config(function() { log.push('lazy2-2'); }) + .run(function() { log.push('lazy2-3'); }); + + injector.loadNewModules(['lazy1']); + expect(log).toEqual(['lazy2-1', 'lazy2-2', 'lazy1-1', 'lazy1-2', 'lazy2-3', 'lazy1-3']); + }); + + it('should not reload a module that is already loaded', function() { + var log = []; + angular.module('initial', []).run(function() { log.push('initial'); }); + var injector = createInjector(['initial']); + expect(log).toEqual(['initial']); + + injector.loadNewModules(['initial']); + expect(log).toEqual(['initial']); + + angular.module('a', []).run(function() { log.push('a'); }); + injector.loadNewModules(['a']); + expect(log).toEqual(['initial', 'a']); + injector.loadNewModules(['a']); + expect(log).toEqual(['initial', 'a']); + + angular.module('b', ['a']).run(function() { log.push('b'); }); + angular.module('c', []).run(function() { log.push('c'); }); + angular.module('d', ['b', 'c']).run(function() { log.push('d'); }); + injector.loadNewModules(['d']); + expect(log).toEqual(['initial', 'a', 'b', 'c', 'd']); + }); + + it('should be able to register a service from a new module', function() { + var injector = createInjector([]); + angular.module('a', []).factory('aService', function() { + return {sayHello: function() { return 'Hello'; }}; + }); + injector.loadNewModules(['a']); + injector.invoke(function(aService) { + expect(aService.sayHello()).toEqual('Hello'); + }); + }); + + + it('should be able to register a controller from a new module', function() { + var injector = createInjector(['ng']); + angular.module('a', []).controller('aController', function($scope) { + $scope.test = 'b'; + }); + injector.loadNewModules(['a']); + injector.invoke(function($controller) { + var scope = {}; + $controller('aController', {$scope: scope}); + expect(scope.test).toEqual('b'); + }); + }); + + + it('should be able to register a filter from a new module', function() { + var injector = createInjector(['ng']); + angular.module('a', []).filter('aFilter', function() { + return function(input) { return input + ' filtered'; }; + }); + injector.loadNewModules(['a']); + injector.invoke(function(aFilterFilter) { + expect(aFilterFilter('test')).toEqual('test filtered'); + }); + }); + + + it('should be able to register a directive from a new module', function() { + var injector = createInjector(['ng']); + angular.module('a', []).directive('aDirective', function() { + return {template: 'test directive'}; + }); + injector.loadNewModules(['a']); + injector.invoke(function($compile, $rootScope) { + var elem = $compile('
')($rootScope); // compile and link + $rootScope.$digest(); + expect(elem.text()).toEqual('test directive'); + elem.remove(); + }); + }); + }); + it('should have a false strictDi property', inject(function($injector) { expect($injector.strictDi).toBe(false); }));