我正在尝试使用KnockoutJS可排序插件的beforeMove
事件,如下所示:https://github.com/rniemeyer/knockout-sortable
在我的应用中,用户应该只能将类别嵌套到两个级别:
- Cat 1
- Cat 1.1
- Cat 1.2
- Cat 1.2.1 <-- Not allowed
目前,我正在尝试从事件的“args”参数访问“targetParent”和“item”。
我可以测试被移动的项目是否有任何子项(true / false)。但我还需要检查预期的“父”是否为根线。
因为,如果当前项目有子项且预期父项不是根线,那么我想取消,因为它会导致三个级别。
现在,我花了好几个小时查看targetParent,sourceParent和所有其他信息,但我不能为我的生活找出它是如何工作的。
有关访问真实预期父项的任何指示都会令人惊讶。如果它是rootline,它应该返回NULL,如果它是一个对象,我需要获取该对象。
长话短说:我需要找到我的项目被放入的一个目标。这可能是NULL,或者是一个对象,用户将该项目放入。
答案 0 :(得分:2)
进入arg
的{{1}}将beforeMove
设置为要删除的项目,将arg.item
设置为将其放入的observableArray。所以,如果你有一个类似的视图模型:
arg.targetParent
然后var Item = function(name, children) {
this.name = name;
this.children = ko.observableArray(children || []);
};
var ViewModel = function() {
var self = this;
this.root = new Item("1", [
new Item("1.1", [
new Item("1.1.1"),
new Item("1.1.2")
]),
new Item("1.2", [
new Item("1.2.1"),
new Item("1.2.2")
])
]);
this.beforeMoveCheck = function(arg) {
var cancel = arg.item.children().length && arg.targetParent !== self.root.children;
console.log("cancelling", !!cancel);
arg.cancelDrop = !!cancel;
};
};
会根据beforeMove
是否有子女以及新父母是否是根的子女来设置arg.cancelDrop
。