这是对问题的跟进:KnockoutJS Sortable group observableArray by field and conditionally sort
我正在努力实现另外两件事。首先,当嵌套列表项被拖动到另一个列表而父项为空时,我想删除父项。我通过创建一个afterMove函数并检查sourceParent长度是否为0来完成此操作。然后我查看路由以查看是否有任何空任务数组并相应地删除。我想知道这是否是一个有效的解决方案。我还必须删除任务,否则任务订阅会在删除计划任务时添加重复项。
其次,最重要的是基础对象(Task)具有order属性。我想将此绑定到可排序的顺序,以便在Scheduled列表中拖动任务时更新order属性。如何从可排序的回调中访问其他列表项的顺序?
请参阅以下Fiddle。
非常感谢任何协助。
答案 0 :(得分:6)
对于第一个问题,您可以采用稍微优化的方式。 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/