JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://cdnjs.cloudflare.com/ajax/libs/Chart.js/0.2.0/Chart.min.js"></script>
<p>
<button data-bind="click: showBar">Barras</button>
<button data-bind="click: showLine">LĂneas</button>
</p>
<canvas width="200" height="200" data-bind="chartType: type, chartData: sales"></canvas>
JavaScript
ko.bindingHandlers.chartType = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
if (!allBindings.has('chartData')) {
throw Error('chartType must be used in conjunction with chartData and (optionally) chartOptions');
}
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var ctx = element.getContext('2d'),
type = ko.unwrap(valueAccessor()),
data = ko.unwrap(allBindings.get('chartData')),
options = ko.unwrap(allBindings.get('chartOptions')) || {},
chart = new Chart(ctx);
chart[type](data, options);
}
};
ko.bindingHandlers.chartData = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
if (!allBindings.has('chartType')) {
throw Error('chartData must be used in conjunction with chartType and (optionally) chartOptions');
}
}
};
ko.bindingHandlers.chartOptions = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
if (!allBindings.has('chartData') || !allBindings.has('chartType')) {
throw Error('chartOptions must be used in conjunction with chartType and chartData');
}
}
};
var model = {
showLine: function () {
this.type('Line');
},
showBar: function () {
this.type('Bar');
},
type: ko.observable('Bar'),
sales: ko.observable({
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
datasets: [{
label: 'Helados',
fillColor: '#152491',
data: [2, 14, 25, 8]
}, {
label: 'Sopas',
fillColor: '#A31011',
data: [16, 11, 1, 15]
}]
})
};
ko.applyBindings(model);