0

我正在尝试使用beforeMove此处概述的 KnockoutJS 可排序插件事件:https ://github.com/rniemeyer/knockout-sortable

在我的应用程序中,用户应该只能将类别嵌套到两个级别:

- Cat 1
    - Cat 1.1
    - Cat 1.2
        - Cat 1.2.1 <-- Not allowed

目前,我正在尝试从事件的“args”参数中访问“targetParent”和“item”。

我可以测试被移动的项目是否有任何孩子(真/假)。但我还需要检查预期的“父母”是否是根线。

因为,如果当前项目有孩子并且预期的父母不是根线,那么我想取消,因为它会导致三个级别。

现在,我花了几个小时查看 targetParent、sourceParent 和所有其他信息,但我终其一生都无法弄清楚它是如何工作的。

任何有关访问真正预期的父项的指针都会令人惊叹。如果是 rootline,它应该返回 NULL,如果它是一个对象,我需要获取该对象。

长话短说:我需要找到我的物品被放入的一个目标。这可能是 NULL,或者是用户将项目放入其中的一个对象。

4

1 回答 1

2

arg进入将beforeMovearg.item设置为被丢弃的项目和被丢弃arg.targetParent的 observableArray。所以,如果你有一个类似的视图模型:

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;
   };
};

然后beforeMovearg.cancelDrop根据是否arg.item有任何孩子以及新父母是否是根的孩子来设置。

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

于 2013-10-26T21:11:18.687 回答