查找observableArray的父级

时间:2012-02-27 11:53:39

标签: drag-and-drop knockout.js

我正在尝试将我的项目转换为使用Ryan Niemeyer的拖放插件(http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html)。

当一个项目被拖动到另一个组时,我需要根据包含observableArray的对象设置被拖动项目的属性,该对象被拖入

我有一个viewModel:

  • 视图模型
    • TopLevelObject
      • 儿童(一个可观察的阵营)
        • 父属性设置为TopLevelObject
        • 的子A
        • 父属性设置为TopLevelObject 的子B
          • 儿童B的孩子(可观察的阵营)
            • 父属性设置为子B
            • 的子X.
            • 父级属性设置为子级B
            • 的子级Y.

我需要设置父属性。我可以访问arg.targetParent,这是上面示例中的'Children'observableArray。所以我认为解决方案看起来像:

ko.bindingHandlers.sortable.afterMove = function(arg) {
    // how do I get the object that contains the arg.targetParent observable array??
    var parentOfTargetObservableArray = /* the containing object of arg.targetParent */                    
    arg.item.MyParent(parentOfTargetObservableArray);
}

给定一个observableArray,有没有办法找到包含它的对象?

2 个答案:

答案 0 :(得分:4)

如果没有在对象上留下更多线索,则无法直接访问observableArray的父级。有几种方法可以做到这一点:

- 将父项添加为observableArray的属性。 observableArrays是函数,它们是对象,因此您实际上可以向它们添加属性,如:

this.Children = ko.observableArray(...);
this.Children.parent = parent;

然后,您只需阅读parent

之后的arg.targetParent属性即可

- 另外,如果您可以访问更高级别的对象(可能已经是全局的),那么您可以遍历顶级子级并检查是否topLevelChild.Children === arg.targetParent

如果您需要代码示例,请与我们联系。

答案 1 :(得分:0)

Knockout提供了一个允许你给它一个DOM元素的函数,它会找到最接近的淘汰父元素。该函数称为ko.dataFor()。您可以在此处查看示例:Using unobtrusive event handlers

以下是您未经测试的代码的快速入侵,但演示了如何使用dataFor:

ko.bindingHandlers.sortable.afterMove = function(arg) {
    var parentOfTargetObservableArray = ko.dataFor(arg.targetParent);
    arg.item.MyParent(parentOfTargetObservableArray);
}