From f1a414b03b7e9895fe33337e120ddbf341701512 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pedro=20Narciso=20Garc=C3=ADa=20Revington?=
Date: Mon, 8 Sep 2014 11:15:06 +0200
Subject: [PATCH] prevent elements are bootstrapped more than once
---
angular.ng-modules.js | 97 ++++++++++++++++++++++++++-----------------
1 file changed, 58 insertions(+), 39 deletions(-)
diff --git a/angular.ng-modules.js b/angular.ng-modules.js
index 9d620f6..220212d 100644
--- a/angular.ng-modules.js
+++ b/angular.ng-modules.js
@@ -10,58 +10,77 @@
NG_MODULE_CLASS_REGEXP = /\sng[:\-]module[s](:\s*([\w\d_]+);?)?\s/;
function append(element) {
- element && elements.push(element);
+ if(!element){
+ return;
+ }
+ if(~elements.indexOf(element)){
+ return;
+ }
+ elements.push(element);
}
- for(var i = 0; i < names.length; i++) {
- var name = names[i];
- names[i] = true;
- append(document.getElementById(name));
- name = name.replace(':', '\\:');
- if (element.querySelectorAll) {
- var elements2;
- elements2 = element.querySelectorAll('.' + name);
- for(var j = 0; j < elements2.length; j++) append(elements2[j]);
-
- elements2 = element.querySelectorAll('.' + name + '\\:');
- for(var j = 0; j < elements2.length; j++) append(elements2[j]);
-
- elements2 = element.querySelectorAll('[' + name + ']');
- for(var j = 0; j < elements2.length; j++) append(elements2[j]);
- }
+ function discoverElements(){
+ var i, j, name, elements2;
+ for(i = 0; i < names.length; i++) {
+ name = names[i];
+ append(document.getElementById(name));
+ name = name.replace(':', '\\:');
+ if (element.querySelectorAll) {
+ elements2 = element.querySelectorAll('.' + name);
+ for(j = 0; j < elements2.length; j++) append(elements2[j]);
+
+ elements2 = element.querySelectorAll('.' + name + '\\:');
+ for(j = 0; j < elements2.length; j++) append(elements2[j]);
+
+ elements2 = element.querySelectorAll('[' + name + ']');
+ for(j = 0; j < elements2.length; j++) append(elements2[j]);
+ }
+ }
}
- for(var i = 0; i < elements.length; i++) {
- var element = elements[i];
+ function findNGModule(element){
+ var attributes = Array.prototype.slice.call(element.attributes), attr, i;
+ for (i = 0; i < attributes.length; i++){
+ attr = attributes[i];
+ if(~names.indexOf(attr.name)){
+ return attr.value;
+ }
+ }
- var className = ' ' + element.className + ' ';
- var match = NG_MODULE_CLASS_REGEXP.exec(className);
- if (match) {
- moduleElements.push(element);
- modules.push((match[2] || '').replace(/\s+/g, ','));
- } else {
- if(element.attributes) {
- for (var attrName in element.attributes) {
- if(attrName == "length") continue;
- var attr = { name: attrName, value: element.attributes[attrName].nodeValue };
-
- if (names[attr.name]) {
- moduleElements.push(element);
- modules.push(attr.value);
+ }
+ function processElements(elements){
+ var module, i, element, className, match, ret =[];
+ for(i = 0; i < elements.length; i++) {
+ element = elements[i];
+
+ className = ' ' + element.className + ' ';
+ match = NG_MODULE_CLASS_REGEXP.exec(className);
+ if (match) {
+ moduleElements.push(element);
+ modules.push((match[2] || '').replace(/\s+/g, ','));
+
+ } else {
+ if(element.attributes) {
+ if((module = findNGModule(element))){
+ ret.push([element, module]);
+ }
}
}
}
- }
+ return ret;
}
-
- for(var i = 0; i < moduleElements.length; i++) {
- var moduleElement = moduleElements[i];
- var module = modules[i].replace(/ /g,'').split(",");
+ discoverElements();
+ bootstrapElements(processElements(elements));
+ function bootstrapElements(items){
+ for(var i = 0; i < items.length; i++) {
+ var moduleElement = items[i][0];
+ var module = items[i][1].replace(/ /g,'').split(",");
angular.bootstrap(moduleElement, module);
}
+ }
}
angular.element(document).ready(function() {
initNgModules(document);
});
-})();
\ No newline at end of file
+})();