2

我有 2 个列表,它们绑定到包含相同类型对象的 observableArrays。我想将一个项目从一个列表拖到另一个列表,但我不想将它添加为一个新项目,我想将它与我拖放到的项目结合起来。

<div>
    <ul data-bind="sortable: { data: customerFields, afterMove: myDropCallback, dragged: myDraggedCallback }">
        <li><span data-bind="text: source"></span></li>
     </ul>
 </div>

 <div>
      <ul data-bind="sortable: { data: mapFields, afterMove: myDropCallback, dragged:myDraggedCallback }">
        <li><span data-bind="text: source"></span> = <span data-bind="text: destination"></span></li>
      </ul>
 </div>

对象包含“源”和“目标”属性,当我从第一个列表中拖动项目并将其放在第二个列表中的项目上时,我想调用一个函数,我可以使用该函数来设置目标项目“源" 属性为要删除的项目的值。

有任何想法吗?

我正在使用https://github.com/rniemeyer/knockout-sortable,它似乎有一个拖动事件,但它看起来不支持我想要做的事情。

4

1 回答 1

1

knockout-sortable不仅提供了sortable-binding,还提供了droppable-binding。这些可以组合使用以获得您想要的结果。

您的容器保留sortable- 绑定,但列表中的每个项目也获得droppable- 绑定,使它们成为有效的移动目标。

droppable触发其中一个项目的 -binding 时,您将获得对正在移动的项目的引用和对正在移动的项目的引用。

从那里你可以做任何你想做的事情,例如,你可以从父容器中删除被拖动的项目并将其与被拖动到的项目合并。

下面的代码片段演示了sortable和的组合draggable

var Item = function(description) {
  var self = this;
  
  self.description = ko.observable(description);
  
  self.dropTo = function(droppedElement) {
    console.log("Drop target: " + self.description());
    console.log("Dropped element: " + droppedElement.description());
  };
};

var ViewModel = function() {
  var self = this;
  
  self.items = ko.observableArray([
    new Item("Item1"),
    new Item("Item2"),
    new Item("Item3"),
    new Item("Item4")
  ]);
  
  self.dropTo = function(arg1) {
    console.log(this);
    console.log(arg1);
  };
};

ko.applyBindings(new ViewModel());
.container {
  background-color: #999;
  padding: 4px;
}

.item {
  background-color: #ccc;
  margin: 4px;
  padding: 4px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-sortable/1.1.0/knockout-sortable.min.js"></script>

<div class="container" data-bind="sortable: items">
  <div class="item" data-bind="text: description, droppable: { data: dropTo }"></div>
</div>

于 2018-03-10T22:48:00.053 回答