JSFiddle - React, Tailwind, and code Playground
HTML
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
<div class="jumbotron" ng-app="plunker">
<p>
<button class="btn btn-default" ui-toggle-class="btn-success">
<i class="fa fa-cloud-upload text"></i>
<span class="text">Upload</span>
<i class="fa fa-check text-active"></i>
<span class="text-active">Success</span>
</button>
</p>
</div>
JavaScript
var app = angular.module('plunker', []);
app.directive('uiToggleClass', ['$timeout', '$document', function($timeout, $document) {
return {
restrict: 'AC',
link: function(scope, el, attr) {
var $ = angular.element;
el.on('click', function(e) {
//e.preventDefault();
var classes = attr.uiToggleClass.split(','),
targets = (attr.target && attr.target.split(',')) || Array(el),
key = 0;
angular.forEach(classes, function( _class ) {
var target = targets[(targets.length && key)];
( _class.indexOf( '*' ) !== -1 ) && magic(_class, target);
$( target ).toggleClass(_class);
key ++;
});
$(el).toggleClass('active');
function magic(_class, target){
var patt = new RegExp( '\\s' +
_class.
replace( /\*/g, '[A-Za-z0-9-_]+' ).
split( ' ' ).
join( '\\s|\\s' ) +
'\\s', 'g' );
var cn = ' ' + $(target)[0].className + ' ';
while ( patt.test( cn ) ) {
cn = cn.replace( patt, ' ' );
}
$(target)[0].className = $.trim( cn );
}
});
}
};
}]);