mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
use document fragments to grow repeaters
- unless we are repeating OPTION elements, buffer new nodes in document fragment and append them to the DOM in one go at the end - for OPTION elements we have to keep on using the old way because of how option widget communicates with select widget this should be change, but that change is out of scope of this CL - modify jqLite to support wrapping of document fragments - fix jqLite documentation typo This change unintentionally avoids the following webkit bug that that affects repeater growth: https://bugs.webkit.org/show_bug.cgi?id=57059 However the following bug affecting shrining of repeaters is still unresolved https://bugs.webkit.org/show_bug.cgi?id=57061
This commit is contained in:
parent
a4863d5244
commit
15ec78f5ef
2 changed files with 19 additions and 5 deletions
|
|
@ -66,7 +66,7 @@ function JQLite(element) {
|
|||
div.innerHTML = '<div> </div>' + element; // IE insanity to make NoScope elements work!
|
||||
div.removeChild(div.firstChild); // remove the superfluous div
|
||||
JQLiteAddNodes(this, div.childNodes);
|
||||
this.remove(); // detach the elements form the temporary DOM div.
|
||||
this.remove(); // detach the elements from the temporary DOM div.
|
||||
} else {
|
||||
JQLiteAddNodes(this, element);
|
||||
}
|
||||
|
|
@ -136,8 +136,7 @@ function JQLiteAddNodes(root, elements) {
|
|||
? elements
|
||||
: [ elements ];
|
||||
for(var i=0; i < elements.length; i++) {
|
||||
if (elements[i].nodeType != 11)
|
||||
root.push(elements[i]);
|
||||
root.push(elements[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -914,6 +914,8 @@ angularWidget('@ng:repeat', function(expression, element){
|
|||
lastIterElement = iterStartElement,
|
||||
collection = this.$tryEval(rhs, iterStartElement),
|
||||
collectionLength = size(collection, true),
|
||||
fragment = (element[0].nodeName != 'OPTION') ? document.createDocumentFragment() : null,
|
||||
addFragment,
|
||||
childScope,
|
||||
key;
|
||||
|
||||
|
|
@ -938,13 +940,26 @@ angularWidget('@ng:repeat', function(expression, element){
|
|||
children.push(childScope);
|
||||
linker(childScope, function(clone){
|
||||
clone.attr('ng:repeat-index', index);
|
||||
lastIterElement.after(clone);
|
||||
lastIterElement = clone;
|
||||
|
||||
if (fragment) {
|
||||
fragment.appendChild(clone[0]);
|
||||
addFragment = true;
|
||||
} else {
|
||||
//temporarily preserve old way for option element
|
||||
lastIterElement.after(clone);
|
||||
lastIterElement = clone;
|
||||
}
|
||||
});
|
||||
}
|
||||
index ++;
|
||||
}
|
||||
}
|
||||
|
||||
//attach new nodes buffered in doc fragment
|
||||
if (addFragment) {
|
||||
lastIterElement.after(jqLite(fragment));
|
||||
}
|
||||
|
||||
// shrink children
|
||||
while(children.length > index) {
|
||||
children.pop().$element.remove();
|
||||
|
|
|
|||
Loading…
Reference in a new issue