large dataset with custom binding
HTML
<script src="http://knockoutjs.com/downloads/knockout-3.1.0.js"></script>
Load and DOM manipulation time: ~<span data-bind='text: finishTime() - startTime'></span> ms
<div data-bind="myDataTable:{columns:ColumnName, data:gridData}"></div>
JavaScript
ko.bindingHandlers.myDataTable = {
init: function () {
return { controlsDescendantBindings: true };
},
update: function (element, valueAccessor, allBindings, viewModel) {
var output = [],
value = valueAccessor(),
columns = ko.unwrap(value.columns),
column1 = columns[0],
column2 = columns[1],
column3 = columns[2],
data = ko.unwrap(value.data),
dataLength = data.length;
output.push('<table><tbody class="ngTBody">');
for (var i = 0; i < dataLength; ++i) {
output.push('<tr class="ngdatarow"><td><span class="nameHeader" data-bind="click: gridNameClick" style="cursor: pointer; text-decoration: underline">');
output.push(data[i][column1]);
output.push('</span></td><td><span class="displayBlock">');
output.push(data[i][column2]);
output.push('</span></td><td><span class="displayBlock">');
output.push(data[i][column3]);
output.push('</span></td></tr>');
}
output.push('</tbody></table>');
element.innerHTML = output.join('');
ko.applyBindingsToDescendants(viewModel, element);
}
};
function ViewModel() {
var self = this;
self.ColumnName = ko.observableArray();
self.gridData = ko.observableArray();
self.totalRowCount = ko.observable();
self.selectedItems = ko.observableArray();
self.selectedRowCount = ko.observable();
self.updateGrid = function (gridDataSource, groupGridOptions) {
self.ColumnName(groupGridOptions.ColumnNameList);
self.gridData(gridDataSource);
self.totalRowCount(self.gridData().length);
self.selectedItems.removeAll();
self.selectedRowCount(0);
};
self.gridNameClick = function (item) {
};
self.startTime = new Date().getTime();
self.finishTime = ko.observable(self.startTime);
}
var vm = new...