2013-04-13 32 views
1

我一直在这个问题上打破了我的头约5-6小时了。淘汰赛tablesorter缓存行

我正在使用tablesorter与knockoutjs结合使用。我的问题是使用tablesorter, 行被缓存,当我尝试删除行时,它们从不消失。我已经创建了一个解释问题的jsfiddle。你可以在小提琴中看到我的指示。

http://jsfiddle.net/a8jUj/29/

我已经看到了很多这谈论这种问题的文章,但他们都说 我们需要改变,而我做的表,但没有工作后打电话到触发更新为了我。

$("#list1").trigger("update"); 

请让我知道我做错了什么。

谢谢。

回答

0

问题是.tablesorter插件不会在您的模型中对self.users数组进行排序,它仅对实际的<tr>元素进行排序。你列分拣机必须调用observableArray.sort法明确定制的比较器作为参数:

self.sortCol = function(colName, event) { 

    // get sorting direction 
    var th = event.target; 
    th.sortDir = (th.sortDir == 'asc' ? 'desc' : 'asc'); 

    // array item comparator 
    function comp(a, b){ 
     // get values to compare 
     var av = a[colName](), bv = b[colName](); 
     // compare using current direction 
     if (th.sortDir == 'asc') { 
      return av == bv ? 0 : av > bv ? 1 : -1; 
     } else { 
      return av == bv ? 0 : av < bv ? 1 : -1; 
     } 
    } 
    // do sort 
    self.users.sort(comp); 
} 

工作小提琴:http://jsfiddle.net/a8jUj/31/

附:举个例子,我通过函数绑定了.sortCol()以获得对事件对象的访问权限。您可以重写模型以在模型属性中存储当前的排序参数。

+0

由于马丁内斯......这让我在正确的方向。 –

0

我认为你遇到的问题是当你更新时表本身不是空的,或者只包含一行。清除TBODY,然后添加您的行(updated demo):

self.resetUsers = function (data, event) { 
    self.users.removeAll(); 

    $("#list1").find('tbody').empty(); 

    self.users.push(new User({ 
     name: "Sidney", 
     age: 26, 
     active: 1 
    })); 

    $("#list1").trigger("update"); 
}; 
+0

感谢您的帮助Mottie。即使这个解决方案在我制作的jsfiddle的情况下工作,但它并不适合我的实际应用程序。我必须确保在我可以将数据加载到绑定到ui的observablearray之前调用这个tablesorter插件,以便让我的东西工作。当然,我不得不像马丁内斯早些时候提到的那样做。 –

+0

@ user1009036如果您使用的是接受的答案,那么您确实不需要tablesorter。都很好 :) – Mottie