Knockout可排序绑定顺序

这是一个问题的后续跟进: KnockoutJS可排序组observableArray by field和conditionally sort

我正在努力实现另外两件事。 首先,当嵌套列表项被拖动到另一个列表而父项为空时,我想删除父项。 我通过创建一个afterMove函数并检查sourceParent长度是否为0来完成此操作。然后我查看路由以查看是否有任何空任务数组并相应地删除。 我想知道这是否是一个有效的解决方案。 我还必须删除任务,否则任务订阅会在删除计划任务时添加重复项。

其次,最重要的是基础对象(Task)具有order属性。 我想将此绑定到可排序的顺序,以便在Scheduled列表中拖动任务时更新order属性。 如何从可排序的回调中访问其他列表项的顺序?

请看下面这个小提琴 。

任何帮助将不胜感激。

对于第一个问题,您可以采用稍微优化的方式。 arg.sourceParent包含在要删除的tasksByRoute项中。 remove函数可以使用函数来对项目运行。 所以,你可以这样写:

 self.afterMoveCallback = function(arg) { if (arg.sourceParent().length === 0) { self.tasksByRoute.remove(function(route) { return route.tasks === arg.sourceParent; }); } }; 

对于第二个问题,我真的想使用一个扩展,它将自动跟踪observableArray中的顺序。 它看起来像:

 //track an index on items in an observableArray ko.observableArray.fn.indexed = function(prop) { prop = prop || 'index'; //whenever the array changes, make one loop to update the index on each this.subscribe(function(newValue) { if (newValue) { var item; for (var i = 0, j = newValue.length; i < j; i++) { item = newValue[i]; if (!ko.isObservable(item[prop])) { item[prop] = ko.observable(); } item[prop](i); //add 1 here if you don't want it to be zero based } } }); //initialize the index this.valueHasMutated(); return this; }; 

在你的情况下,你会像以下一样使用它:

 self.scheduledTasks = ko.observableArray([ new Task(8, 4, "Route 4", "Cust 8", 1), new Task(9, 4, "Route 4", "Cust 9", 2), new Task(10, 5, "Route 5", "Cust 10") ]).indexed("order"); 

以下是更新这两个更改的示例: http : //jsfiddle.net/rniemeyer/usVKQ/