diff options
| author | Siddique Hameed | 2014-01-17 12:17:22 -0600 | 
|---|---|---|
| committer | Peter Bacon Darwin | 2014-03-18 12:02:19 +0000 | 
| commit | 748a6c8d9d8d61c3ee18eec462abe8ff245d6a98 (patch) | |
| tree | e67d4f341b9c60a22f07af8b9579b7ae97ff8e3c | |
| parent | ed4cd6c3c6a30ddfead1cbcf48f2ac6adf60a802 (diff) | |
| download | angular.js-748a6c8d9d8d61c3ee18eec462abe8ff245d6a98.tar.bz2 | |
fix(angular.bootstrap): only allow angular to load once
This is hard to test as a unit-test, since it involves the actual loading
of angular, but it turns out that it is easy to test using a protractor
e2e test.
Closes #5863
Closes #5587
| -rw-r--r-- | src/Angular.js | 35 | ||||
| -rw-r--r-- | src/angular.suffix | 6 | 
2 files changed, 41 insertions, 0 deletions
| diff --git a/src/Angular.js b/src/Angular.js index 96df13f4..ec69cc1a 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1241,6 +1241,41 @@ function angularInit(element, bootstrap) {   * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.   * They must use {@link ng.directive:ngApp ngApp}.   * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts.   This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + * <example name="multi-bootstrap" module="multi-bootstrap"> + * <file name="index.html"> + * <script src="../../../angular.js"></script> + * <div ng-controller="BrokenTable"> + *   <table> + *   <tr> + *     <th ng-repeat="heading in headings">{{heading}}</th> + *   </tr> + *   <tr ng-repeat="filling in fillings"> + *     <td ng-repeat="fill in filling">{{fill}}</td> + *   </tr> + * </table> + * </div> + * </file> + * <file name="controller.js"> + * var app = angular.module('multi-bootstrap', []) + * + * .controller('BrokenTable', function($scope) { + *     $scope.headings = ['One', 'Two', 'Three']; + *     $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]]; + * }); + * </file> + * <file name="protractor.js" type="protractor"> + * it('should only insert one table cell for each item in $scope.fillings', function() { + *  expect(element.all(by.css('td')).count()) + *      .toBe(9); + * }); + * </file> + * </example> + *   * @param {Element} element DOM element which is the root of angular application.   * @param {Array<String|Function|Array>=} modules 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) diff --git a/src/angular.suffix b/src/angular.suffix index c86200bb..9429d4fc 100644 --- a/src/angular.suffix +++ b/src/angular.suffix @@ -1,3 +1,9 @@ +  if (window.angular.bootstrap) { +    //AngularJS is already loaded, so we can return here... +    console.log('WARNING: Tried to load angular more than once.'); +    return; +  } +    //try to bind to jquery now so that one can write angular.element().read()    //but we will rebind on bootstrap again.    bindJQuery(); | 
