我正在尝试将tablesorter与savesort小部件一起使用。该表由knokout填充。
第一次填充表时,我得到正确的行数,并记住排序。然后我用数据重新填充表,使用ajax并绑定到knockout数组。然后数据加倍,但敲除(正确),只跟踪一半的数据。
到目前为止,我已将其追踪到我在此方法中应用已保存的排序时:
self.tablesorter = function () {
$('table.tablesorterTranslation').trigger("update");
setTimeout(function () {
var sl = $.tablesorter.storage($('table.tablesorterTranslation'), 'tablesorter-savesort');
var sortList = (sl && sl.hasOwnProperty('sortList') && $.isArray(sl.sortList)) ? sl.sortList : '';
if (sortList && sortList.length > 0) {
// update sort change
$('table.tablesorterTranslation').trigger("sorton", [sortList]);
}
}, 1000);
return false;
};
此方法由敲除后期绑定调用。
在调用方法之前,我有一个tablerow用于淘汰阵列中的每个项目,在postaction之后,我有两个,一个由knockout跟踪,一个似乎是由tablesorter添加的。
这是由于tablesorter缓存值,有没有办法清理它?
html:
<table class="tablesorterTranslation" data-bind="visible: contents().length > 0">
<colgroup>
<col class="referencenumber"/>
<col class="title"/>
</colgroup>
<thead>
<tr>
<th class="referencenumber">Ref number</th>
<th class="title">Title</th>
</tr>
</thead>
<tbody data-bind="foreach: contents, postAction: tablesorter(), visible: contents().length > 0">
<tr>
<td class="referencenumber">
<span data-bind="text: contentReferenceNumber"></span>
</td>
<td class="title">
<a data-bind="attr: {href: previewUrl, title: previewTitle}, click: previewpopup" class="preview_translation"><%: AdminResources.Menu_Preview %></a>
</td>
</tr>
</tbody>
</table>
重新填充表格的ajax:
self.setContentList = function () {
if ($('#LanguageIdNameValuePairs option').length > 0) {
self.contents.removeAll();
self.loading(true);
$.ajax('<%= Url.Action("GetContentList", "TranslateContentMenu") %>',
{
dataType: 'json',
data: {
languageId: $('#LanguageIdNameValuePairs').val(),
page: self.page
},
success: function (allData) {
var mappedContent = $.map(allData, function (item) { return new ContentViewModel(item); });
self.loading(false);
self.contents(mappedContent);
}
});
} else {
self.contents(new Array());
}
};
contentviewmodel:
(function (ko) {
PODIUM.translation.ContentViewModel = function(data) {
this.contentReferenceId = ko.observable(data.contentReferenceId);
this.contentName = data.contentName;
this.previewUrl = ko.observable(data.previewUrl);
this.previewTitle = ko.observable(data.previewTitle);
this.publishTitle = ko.observable(data.publishTitle);
this.contentReferenceNumber = ko.observable(data.contentReferenceNumber);
};
}(ko));
最后,填充表并定义tablesort,使用saveort(saveort是我认为的问题)。
$('#OptionsMenu').change(function () {
viewModel.setContentList();
});
$('table.tablesorterTranslation').tablesorter({
widgets: ["saveSort"],
widgetOptions: {}
});
我有一个带有一些值的选择列表,当这个更改时,我从服务器获取新值并重新填充表。这是它记住旧值的地方,但我想“清理”表并重新开始。
答案 0 :(得分:2)
我自己找到了答案,但不是我想要的答案。
基本上,由于我正在使用knockout,我不应该对视图本身进行更改,而是更改viewmodel。所以,我看看对数组进行排序,并让淘汰赛完成其余的魔术。
我开始删除所有tablesorter的痕迹(除了表上的css类,因为我已经在样式表中使用了这个)。
然后我添加了这个方法:
self.sortContents = function (element, sortProperty) {
var elem = $(element);
var direction = (elem.hasClass('headerSortDown')) ? 'headerSortUp' : 'headerSortDown';
var selector = $.trim($(element).attr('class').replace('header', '').replace('headerSortUp', '').replace('headerSortDown', ''));
if (direction == 'headerSortUp') {
self.filterStorage.updateSortFilter(selector, sortProperty);
self.contents.sort(function(left, right) {
return left[sortProperty] == right[sortProperty] ? 0 : (left[sortProperty] > right[sortProperty] ? -1 : 1);
});
elem.removeClass('headerSortDown');
elem.addClass('headerSortUp');
} else {
self.filterStorage.updateSortFilter(selector, sortProperty);
self.contents.sort(function (left, right) {
return left[sortProperty] == right[sortProperty] ? 0 : (left[sortProperty] < right[sortProperty] ? -1 : 1);
});
elem.removeClass('headerSortUp');
elem.addClass('headerSortDown');
}
};
请注意我使用与tablesort插件相同的css类,这是因为tablesorter已经在应用程序的其他位置使用,并且css已经存在于那些类中。
我将表头更改为:
<th class="title header" data-bind="click: function(data, event){ return sortContents($(event.target), 'contentName')}"><%: AdminResources.ContentOverview_Title %></th>
然后,因为我在这个混乱中起床,试图保存排序状态,我不得不为此找出一些东西。所以我用方法,更新和获取创建了一个新类。这节省了哪个标题我正在排序和方向。
function getSortFilter() {
var cookie = $.cookie(tableSortedByCookie);
return JSON.parse(cookie);
}
function updateSortFilter(selector, property) {
$.cookie(tableSortedByCookie, null);
$.cookie(tableSortedByCookie, JSON.stringify({ selector: selector, property: property }), { path: '/' });
}
您可以在sortcontents方法中查看update的用法。 (此方法位于包含该表的页面的viewmodel上)。
然后我将其添加到ajax成功方法的底部:
var tableSortCookie = self.filterStorage.getSortFilter();
if (tableSortCookie != null && tableSortCookie.selector != null) {
var header = $('.tablesorterTranslation th.' + tableSortCookie.selector);
self.sortContents(header, tableSortCookie.property);
}
然后,我能够使用knockout对数据进行排序,以及在更改数据和刷新页面时存储状态并加载状态。