Skip to content

Instantly share code, notes, and snippets.

@kamranayub
Last active December 15, 2015 07:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamranayub/5224521 to your computer and use it in GitHub Desktop.
Save kamranayub/5224521 to your computer and use it in GitHub Desktop.
CSS Class binding for Knockout.js
//
// Observable CSS Class Binding
//
// See Fiddle for usage: http://jsfiddle.net/kamranayub/3ahUA/
//
ko.bindingHandlers['class'] = {
update: function (element, valueAccessor) {
var currentValue = ko.utils.unwrapObservable(valueAccessor()),
prevValue = element['__ko__previousClassValue__'],
// Handles updating adding/removing classes
addOrRemoveClasses = function (singleValueOrArray, shouldHaveClass) {
if (Object.prototype.toString.call(singleValueOrArray) === '[object Array]') {
ko.utils.arrayForEach(singleValueOrArray, function (cssClass) {
var value = ko.utils.unwrapObservable(cssClass);
ko.utils.toggleDomNodeCssClass(element, value, shouldHaveClass);
});
} else if (singleValueOrArray) {
ko.utils.toggleDomNodeCssClass(element, singleValueOrArray, shouldHaveClass);
}
};
// Remove old value(s) (preserves any existing CSS classes)
addOrRemoveClasses(prevValue, false);
// Set new value(s)
addOrRemoveClasses(currentValue, true);
// Store a copy of the current value
element['__ko__previousClassValue__'] = currentValue.concat();
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment