This can be achieved, but not with how you're filtering the data. Instead of your current filter actually updating and the ng-repeat rendering new elements, you're just simply changing the data, which doesn't re-render and no animate classes are applied. But, if change how you're filter so that it actually uses the filter, then things start working.
http://jsfiddle.net/Lfmp8pdu/4/
angular .module('App', ['ngAnimate']) .controller('AppCtrl', [ function() { var data = this; data.next = next; data.previous = previous; init(); function init() { data.items = [ {title: "One", page: 1}, {title: "Two", page: 1}, {title: "Three", page: 1}, {title: "Four", page: 2}, {title: "Five", page: 2}, {title: "Six", page: 2}, {title: "Seven", page: 3} ]; data.page = 1; } function next() { data.page++; } function previous() { data.page--; } } ]);
And the modified filter in html:
<div class="itemsContainer"> <span ng-repeat="item in ctrl.items | filter:ctrl.page" class="animate"> {{item.title}} </span> </div>
This is not a good way to do this as far as the pagination goes. There are better solutions out there. Also, if you want this to be more like a true carousel, then you could try just inlining all of your elements and shifting the entire thing left/right - so in that case, everything would always be rendered, you would not use a filter, but instead change the left/right absolute position in CSS via your buttons.