数据表和淘汰赛整合工作问题

时间:2013-06-12 12:40:27

标签: knockout.js datatables

大家好我正在开展一个项目,我必须整合淘汰赛和数据表,我必须使用它们来实现CRUD操作...... 我使用过从这个源下载的knockout-datatables.js https://github.com/CogShift/Knockout.Extensions 我的应用程序工作正常,但我执行rowlevel删除/编辑.....这是类似的 示例acshttp://jsfiddle.net/ducka/haq2y/

行级别事件(示例删除)只能工作一次...如果我必须使它工作我必须要么排序或使用分页我不明白为什么会发生这样....可以请一个人帮助我

谢谢:)

2 个答案:

答案 0 :(得分:0)

这可能是执行删除后错误地重新绑定视图的问题。如果您的数据或视图在删除后重新绑定,请确保您没有使用新的observable覆盖原始的observable。例如,如果您的模型具有定义为:

的属性
self.myData = ko.observableArray([initialData]);

你从AJAX获得新数据,确保你没有这样做

self.myData = ko.observableArray([newData]);

而是你想要这样做

self.myData([newData]);

如果原帖中没有更多信息,我担心这只是猜测。

要对此进行更深入的讨论,请在此处的博客文章中查看“重置视图模型的正确方法”:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

答案 1 :(得分:0)

使用this custom binding designed for datatables - >

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 };
}}; 

JSFIDDLE