Knockout Isotope Binding
HTML
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/3.0.0/normalize.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-debug.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery.isotope/1.5.25/jquery.isotope.js"></script>
<script src="//rawgithub.com/dougludlow/knockout.isotope/master/src/knockout.isotope.js"></script>
<section id="options">
<button class="shuffle">Shuffle</button>
</section>
<div id="container" data-bind="isotope: { data: elements, options: isotopeOptions }">
<div class="element" data-bind="attr: { 'data-symbol': symbol }, css: $root.getTypes(type), style: { backgroundColor: '#' + color }, click: $root.remove">
<p class="number" data-bind="text: number"></p>
<h3 class="symbol" data-bind="text: symbol"></h3>
<h2 class="name" data-bind="text: name"></h2>
<p class="weight" data-bind="text: mass"></p>
</div>
</div>
CSS
/**** Isotope CSS3 transitions ****/
.isotope,
.isotope .isotope-item {
-webkit-transition-duration: 0.8s;
-moz-transition-duration: 0.8s;
-ms-transition-duration: 0.8s;
-o-transition-duration: 0.8s;
transition-duration: 0.8s;
}
.isotope {
-webkit-transition-property: height, width;
-moz-transition-property: height, width;
-ms-transition-property: height, width;
-o-transition-property: height, width;
transition-property: height, width;
}
.isotope .isotope-item {
-webkit-transition-property: -webkit-transform, opacity;
-moz-transition-property: -moz-transform, opacity;
-ms-transition-property: -ms-transform, opacity;
-o-transition-property: -o-transform, opacity;
transition-property: transform, opacity;
}
/**** disabling Isotope CSS3 transitions ****/
.isotope.no-transition,
.isotope.no-transition .isotope-item,
.isotope .isotope-item.no-transition {
-webkit-transition-duration: 0s;
-moz-transition-duration: 0s;
-ms-transition-duration: 0s;
-o-transition-duration: 0s;
transition-duration: 0s;
}
JavaScript
function ViewModel() {
var self = this;
self.elements = ko.observableArray([]);
self.isotopeOptions = {
itemSelector : '.element',
getSortData : {
symbol : function( $elem ) {
return $elem.attr('data-symbol');
},
//category : function( $elem ) {
// return $elem.attr('data-category');
//},
number : function( $elem ) {
return parseInt( $elem.find('.number').text(), 10);
},
weight : function( $elem ) {
return parseFloat( $elem.find('.weight').text().replace( /[\(\)]/g, ''));
},
name : function ( $elem ) {
return $elem.find('.name').text();
}
}
}
self.load = function() {
$.getJSON('http://rawgit.com/dougludlow/chemistry/master/elements.json', function(data) {
self.elements(data);
});
};
self.getTypes = function(csv) {
var types = csv.split(',');
for (var i = 0; i < types.length; i++)
types[i] = types[i].replace(/\s+/g, '-');
return types.join(' ');
};
self.remove = function(element) {
self.elements.remove(element);
};
}
var vm = new ViewModel();
vm.load();
ko.applyBindings(vm);
$('button.shuffle').click(function() {
$('#container').isotope('shuffle');
});