<!DOCTYPE html>
<html>

  <head>
    <link data-require="bootstrap@3.3.5" data-semver="3.3.5" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" />
    <script data-require="angular.js@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular.js"></script>
    <script data-require="angular-animate@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular-animate.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
    <style>
      .change-add {
          transition: all 0.1s;
        -webkit-transition: all 0.1s ease-in-out;
      }
      .change-remove {
          transition: all 0.8s;
        -webkit-transition: all 0.8s ease-in-out;
      }
      .change {
        background-color: red!important;
        transform: scale(1.5);
      }
  </style>
  </head>

  <body ng-app="app">
    <div ng-init="value = 42">
      <input ng-model="value" />
      <button class="btn btn-primary">
        Products
        <span animate-change="value" ng-bind="value" class="badge"></span>
      </button>
    </div>
  </body>

</html>
var app = angular.module('app', ['ngAnimate'])

app.directive('animateChange', function($animate) {
  return function(scope, elem, attr) {
      var current;
      scope.$watch(attr.animateChange, function(nv, ov) {
        if (nv != ov) {
            var c = 'change';
            current && $animate.cancel(current);
            current = $animate.addClass(elem,c);
            current.then(function() {
              current = $animate.removeClass(elem,c);
            });
        }
        
      })  
  }  
})