KnockoutJS Sortable BeforeMove

时间:2013-10-26 19:35:34

标签: knockout.js jquery-ui-sortable

我正在尝试使用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,或者是一个对象,用户将该项目放入。

1 个答案:

答案 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

以下是一个示例:http://plnkr.co/edit/yfAEZawfWxdu1yBdtlDR?p=preview