我有一个简单的HTML表格,它使用knockoutJS绑定。但是,我添加了一个自定义绑定,它在表上应用了jquery数据表插件。
当我点击标题时,表格会消失。知道如何让它与knockoutJS一起工作吗?
答案 0 :(得分:3)
它实际上没有必要使用knockoutJs来执行dataTable的绑定。由于knockoutJs已经将HTML表绑定到模型,只需使用以下内容:
$(function() {
var dtOptions = {
"bPaginate": false,
"bLengthChange": false,
"bFilter": false,
"bInfo": false,
bJQueryUI: true
}
var dt = $("#leadsTable").dataTable(dtOptions);
$("#searchButton").click(function() {
//... set url with search terms...
$.get(url, function (data) {
// destroy existing table
dt.fnDestroy();
ko.mapping.fromJS(data, vm.model);
// re-created AFTER ko mapping
dt.dataTable(dtOptions);
});
})
});
var serialisedModel = @Html.Raw(new JavaScriptSerializer().Serialize(Model));
var vm = {
data: ko.toJSON(serialisedModel),
}
ko.applyBindings(vm);
关键部分是在映射之前销毁现有的dataTable,并在映射之后重新创建。我必须保留对初始dataTable的引用,以便以后销毁......
答案 1 :(得分:3)
这是做到这一点的方法......我已经做了一个jsfiddle显示:
这是针对jQuery数据表的淘汰自定义绑定解决方案。
ko.bindingHandlers.dataTablesForEach = {
page: 0,
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var options = ko.unwrap(valueAccessor());
ko.unwrap(options.data);
if(options.dataTableOptions.paging){
valueAccessor().data.subscribe(function (changes) {
var table = $(element).closest('table').DataTable();
ko.bindingHandlers.dataTablesForEach.page = table.page();
table.destroy();
}, null, 'arrayChange');
}
var nodes = Array.prototype.slice.call(element.childNodes, 0);
ko.utils.arrayForEach(nodes, function (node) {
if (node && node.nodeType !== 1) {
node.parentNode.removeChild(node);
}
});
return ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var options = ko.unwrap(valueAccessor()),
key = 'DataTablesForEach_Initialized';
ko.unwrap(options.data);
var table;
if(!options.dataTableOptions.paging){
table = $(element).closest('table').DataTable();
table.destroy();
}
ko.bindingHandlers.foreach.update(element, valueAccessor, allBindings, viewModel, bindingContext);
table = $(element).closest('table').DataTable(options.dataTableOptions);
if (options.dataTableOptions.paging) {
if (table.page.info().pages - ko.bindingHandlers.dataTablesForEach.page == 0)
table.page(--ko.bindingHandlers.dataTablesForEach.page).draw(false);
else
table.page(ko.bindingHandlers.dataTablesForEach.page).draw(false);
}
if (!ko.utils.domData.get(element, key) && (options.data || options.length))
ko.utils.domData.set(element, key, true);
return { controlsDescendantBindings: true };
}};