Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

fix(ngAnimate): Fix text node animation #11722

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/ng/animate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

var $animateMinErr = minErr('$animate');
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;

function mergeClasses(a,b) {
if (!a && !b) return '';
Expand All @@ -12,10 +13,10 @@ function mergeClasses(a,b) {
return a + ' ' + b;
}

function extractElementNode(element) {
function extractNonCommentNode(element) {
for (var i = 0; i < element.length; i++) {
var elm = element[i];
if (elm.nodeType === ELEMENT_NODE) {
if (elm.nodeType === ELEMENT_NODE || elm.nodeType === TEXT_NODE) {
return elm;
}
}
Expand Down Expand Up @@ -241,7 +242,7 @@ var $AnimateProvider = ['$provide', function($provide) {
// from the dom sometime before this code runs then let's
// just stick to using the parent element as the anchor
if (afterElement) {
var afterNode = extractElementNode(afterElement);
var afterNode = extractNonCommentNode(afterElement);
if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) {
afterElement = null;
}
Expand Down
2 changes: 1 addition & 1 deletion src/ngAnimate/.jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@
"packageStyles": false,
"removeFromArray": false,
"stripCommentsFromElement": false,
"extractElementNode": false
"extractNonCommentNode": false
}
}
4 changes: 2 additions & 2 deletions src/ngAnimate/animateQueue.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {

return {
on: function(event, container, callback) {
var node = extractElementNode(container);
var node = extractNonCommentNode(container);
callbackRegistry[event] = callbackRegistry[event] || [];
callbackRegistry[event].push({
node: node,
Expand All @@ -159,7 +159,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
: filterFromRegistry(entries, container, callback);

function filterFromRegistry(list, matchContainer, matchCallback) {
var containerNode = extractElementNode(matchContainer);
var containerNode = extractNonCommentNode(matchContainer);
return list.filter(function(entry) {
var isMatch = entry.node === containerNode &&
(!matchCallback || entry.callback === matchCallback);
Expand Down
11 changes: 6 additions & 5 deletions src/ngAnimate/shared.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ var isFunction = angular.isFunction;
var isElement = angular.isElement;

var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;

var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';
Expand Down Expand Up @@ -72,7 +73,7 @@ function removeFromArray(arr, val) {
}

function stripCommentsFromElement(element) {
if (element.nodeType === ELEMENT_NODE) {
if (element.nodeType === ELEMENT_NODE || element.nodeType === TEXT_NODE) {
return jqLite(element);
}
if (element.length === 0) return [];
Expand All @@ -81,17 +82,17 @@ function stripCommentsFromElement(element) {
// is the only element within the jqLite wrapper.
// (it's important that we retain the element instance.)
if (element.length === 1) {
return element[0].nodeType === ELEMENT_NODE && element;
return (element[0].nodeType === ELEMENT_NODE || element[0].nodeType === TEXT_NODE) && element;
} else {
return jqLite(extractElementNode(element));
return jqLite(extractNonCommentNode(element));
}
}

function extractElementNode(element) {
function extractNonCommentNode(element) {
if (!element[0]) return element;
for (var i = 0; i < element.length; i++) {
var elm = element[i];
if (elm.nodeType == ELEMENT_NODE) {
if (elm.nodeType === ELEMENT_NODE || elm.nodeType === TEXT_NODE) {
return elm;
}
}
Expand Down
14 changes: 14 additions & 0 deletions test/ngAnimate/animateSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,20 @@ describe("animations", function() {
};
}));

it('should animate text nodes', function() {
module(function($animateProvider) {
$animateProvider.classNameFilter(/only-allow-this-animation/);
});
inject(function($animate, $rootScope, $compile) {
var newWrapper = angular.element('<span>new text</span>');
$compile(newWrapper.contents())($rootScope);
var oldContents = element.contents();
var newContents = newWrapper.contents();
$animate.enter(newContents, element);
$animate.leave(oldContents);
});
});

it('should animate only the specified CSS className matched within $animateProvider.classNameFilter', function() {
module(function($animateProvider) {
$animateProvider.classNameFilter(/only-allow-this-animation/);
Expand Down