我正在尝试将我的项目转换为使用Ryan Niemeyer的拖放插件(http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html)。
当一个项目被拖动到另一个组时,我需要根据包含observableArray的对象设置被拖动项目的属性,该对象被拖入。
我有一个viewModel:
我需要设置父属性。我可以访问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,有没有办法找到包含它的对象?
答案 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);
}