fix($compile): fix replaceWith

the old implementation didn't reattach jquery/jqlite data which caused
things like  to be lost

I tried various implementations but it appears that by reattaching the data
to the new node by copying the expando property is the most reliable of all.
This commit is contained in:
Igor Minar 2012-05-03 21:49:06 -07:00
parent a44d3dcd6a
commit b431ee3850
2 changed files with 7 additions and 13 deletions

View file

@ -75,7 +75,7 @@
*/
var jqCache = {},
jqName = 'ng-' + new Date().getTime(),
jqName = JQLite.expando = 'ng-' + new Date().getTime(),
jqId = 1,
addEventListenerFn = (window.document.addEventListener
? function(element, type, fn) {element.addEventListener(type, fn, false);}

View file

@ -867,22 +867,12 @@ function $CompileProvider($provide) {
linkRootElement = linkQueue.pop(),
origLinkNode = linkQueue.pop(),
scope = linkQueue.pop(),
linkNode = compileNode,
$origLinkNode = jqLite(origLinkNode);
linkNode = compileNode;
if (origLinkNode !== origCompileNode) {
// it was cloned therefore we have to clone as well.
linkNode = JQLiteClone(compileNode);
replaceWith(linkRootElement, $origLinkNode, linkNode);
}
if (replace) {
if ($origLinkNode.data('$scope')) {
// if the original element before replacement had a new scope, the replacement should
// get it as well
jqLite(linkNode).data('$scope', scope);
}
dealoc($origLinkNode);
replaceWith(linkRootElement, jqLite(origLinkNode), linkNode);
}
afterTemplateNodeLinkFn(function() {
@ -992,12 +982,16 @@ function $CompileProvider($provide) {
for(i = 0, ii = $rootElement.length; i < ii; i++) {
if ($rootElement[i] == oldNode) {
$rootElement[i] = newNode;
break;
}
}
}
if (parent) {
parent.replaceChild(newNode, oldNode);
}
newNode[jqLite.expando] = oldNode[jqLite.expando];
$element[0] = newNode;
}
}];