diff options
| -rw-r--r-- | docs/content/error/ng/btstrpd.ngdoc | 29 | ||||
| -rw-r--r-- | src/Angular.js | 6 | ||||
| -rw-r--r-- | test/AngularSpec.js | 26 | 
3 files changed, 61 insertions, 0 deletions
| diff --git a/docs/content/error/ng/btstrpd.ngdoc b/docs/content/error/ng/btstrpd.ngdoc new file mode 100644 index 00000000..401e2767 --- /dev/null +++ b/docs/content/error/ng/btstrpd.ngdoc @@ -0,0 +1,29 @@ +@ngdoc error +@name ng:btstrpd +@fullName App Already Bootstrapped with this Element +@description + +Occurs when calling angular.bootstrap on an element that has already been bootstrapped. + +This usually happens when you accidentally use both `ng-app` and `angular.bootstrap` to bootstrap an application. + +``` +<html> +... +  <body ng-app="myApp"> +    <script> +      angular.bootstrap(document.body, ['myApp']); +    </script> +  </body> +</html> +``` + +Note that for bootrapping purposes, the `<html>` element is the same as `document`, so the following will also throw an error. +``` +<html> +... +<script> +  angular.bootstrap(document, ['myApp']); +</script> +</html> +``` diff --git a/src/Angular.js b/src/Angular.js index 1a90f8bc..90c7234a 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1049,6 +1049,12 @@ function angularInit(element, bootstrap) {  function bootstrap(element, modules) {    var doBootstrap = function() {      element = jqLite(element); + +    if (element.injector()) { +      var tag = (element[0] === document) ? 'document' : startingTag(element); +      throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag); +    } +      modules = modules || [];      modules.unshift(['$provide', function($provide) {        $provide.value('$rootElement', element); diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 56fc985c..f049c2fd 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -656,6 +656,32 @@ describe('angular', function() {          /\[\$injector:modulerr] Failed to instantiate module doesntexist due to:\n.*\[\$injector:nomod] Module 'doesntexist' is not available! You either misspelled the module name or forgot to load it\./        );      }); + + +    it('should complain if an element has already been bootstrapped', function () { +      var element = jqLite('<div>bootstrap me!</div>'); +      angular.bootstrap(element); + +      expect(function () { +        angular.bootstrap(element); +      }).toThrowMatching( +        /\[ng:btstrpd\] App Already Bootstrapped with this Element '<div class="?ng\-scope"?( ng\-[0-9]+="?[0-9]+"?)?>'/i +      ); + +      dealoc(element); +    }); + + +    it('should complain if manually bootstrapping a document whose <html> element has already been bootstrapped', function () { +      angular.bootstrap(document.getElementsByTagName('html')[0]); +      expect(function () { +        angular.bootstrap(document); +      }).toThrowMatching( +        /\[ng:btstrpd\] App Already Bootstrapped with this Element 'document'/i +      ); + +      dealoc(document); +    })    }); | 
