请找到jsfiddle 示例。我有一组可观察的人员,每个人都有 id、firstName 和 lastName。用户按任何属性在两个方向上对该数组进行排序。
然后,在某个时候,我需要更新我的数组,我使用了 knockout.mapping.fromJS 函数:
this.rockStarsMapping = {
create: function (options) {
// just to make sure that key works
console.log('created');
return options.data;
},
key: function(data) {
return data.id;
}
};
this.rockStars = ko.observableArray([]);
this.getRockStars = function() {
// here should be some ajax call instead of a stub
var newRockStars = [
{ id: 1, firstName: "John", lastName: "Lehnon" },
{ id: 2, firstName: "Paul", lastName: "McCartney" },
...
];
ko.mapping.fromJS(newRockStars, self.rockStarsMapping, self.rockStars);
};
问题是,新数组按 id 排序(例如),这种排序优于现有数组中的排序。
我目前的解决方案是记住当前的排序列名称和排序方向,但它不能正常工作,因为其他列可能有其他排序方向。例如,在我的 jsfiddle 代码中,尝试先按 Id 降序排序(6、5、4、...),然后按名字排序。现在,如果您单击“获取摇滚明星”,则 Id 列中的排序顺序会发生变化,这不是您想要的行为。
如何保持排序顺序不变?更重要的是——如何确保新项目位于数组的正确位置?