From b431ee38509724ba9098a7be7a8d6c5dcded4fe9 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Thu, 3 May 2012 21:49:06 -0700 Subject: [PATCH] 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. --- src/jqLite.js | 2 +- src/ng/compile.js | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index efe3ec31cc3a..02291932d485 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -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);} diff --git a/src/ng/compile.js b/src/ng/compile.js index 5db7b6712f5e..00628365fb10 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -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; } }];