1

我正在为我的页面使用 Knockout.js。我的 ViewModel 包含一个对象数组。每个对象都包含一个子数组。更一般地说,这应该表示一个包含列和列内容的表。

首先我正在处理 foreach:itemArray 以获取列。然后我使用嵌套的 foreach:childs,其中 childs 是列内容的数组。

我的孩子应该可以在列之间拖动。因此我用我找到的 js 替换了嵌套的 foreach

https://github.com/rniemeyer/knockout-sortable

http://jsfiddle.net/rniemeyer/Jr2rE/

再次使用代码 - 第一阶段:

<div id="lanesContainer" data-bind="foreach: lanes">

然后遵循嵌套的foreach(在#lanesContainer 内)

<ul data-bind="sortable: { template: 'laneTemplate', data: childs, afterMove: $root.dropCallback }">

我的项目现在是可拖动的,但是以某种方式放置失败了。我的调试器在 js 的以下部分中断:

//take destroyed items into consideration
if (!templateOptions.includeDestroyed) {
  targetUnwrapped = targetParent();
  for (i = 0; i < targetIndex; i++) {
    //add one for every destroyed item we find before the targetIndex in the target array
    if (targetUnwrapped[i] && targetUnwrapped[i]._destroy) {
      targetIndex++;
    }
  }
}

它在第三行中断,因为 targetParent 是一个对象,而不是一个函数。我该如何解决问题?

4

2 回答 2

1

改变targetUnwrapped = targetParent();

targetUnwrapped = ko.utils.unwrapObservable(targetParent);
于 2013-02-19T07:55:55.160 回答
0

好的,谢谢到目前为止。我的 ViewModel 包含一个函数,在每次放置时都会调用该函数。

self.dropCallback = function (arg) {
    var item = arg.item;
    var sourceParent = arg.sourceParent();
    var targetParent = arg.targetParent();
    blah(); //console.log("Moved '" + arg.item.name() + "' from " + arg.sourceParent.id + " (index: " + arg.sourceIndex + ") to " + arg.targetParent.id + " (index " + arg.targetIndex + ")");
};

变量 sourceParent 和 targetParent 现在代表用于 foreach 的数组。我怎样才能“走”一个更高的级别,到下一个父母?

于 2013-02-19T14:02:32.647 回答