aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/content/error/ng/btstrpd.ngdoc29
-rw-r--r--src/Angular.js6
-rw-r--r--test/AngularSpec.js26
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);
+ })
});