gpt4 book ai didi

javascript - knockout 嵌套排序列表

转载 作者:行者123 更新时间:2023-11-30 05:39:46 24 4
gpt4 key购买 nike

我需要构建一个网页,其中包含两个可以交换的列表。这些列表中的项目也可以从一个列表交换或移动到另一个列表。

我使用 knockoutjs 和 knockoutjs-sortable 来实现它。

HTML

<ul class="Tasks" data-bind="sortable: TaskLists">
<li class="taskList">
<span data-bind="text: Title" style='background: lightgray;'></span>
<ul data-bind="sortable: Tasks">
<li class="item">
<span class="taskName" href="#" data-bind="text: name"></span>
</li>
</ul>
</li>
</ul>

JS

var Task = function (name) {
this.name = ko.observable(name);
}

var ViewModel = function () {
var self = this;
self.tasks1 = ko.observableArray([]);
self.tasks2 = ko.observableArray([]);
for (var i = 0; i < 5; i++) {
self.tasks1.push(new Task("This task belongs to list one"));
self.tasks2.push(new Task("This task belongs to list two"));
}
self.TaskList1 = {
Tasks: self.tasks1,
Title: 'List One'
};
self.TaskList2 = {
Tasks: self.tasks2,
Title: 'List Two'
};
self.TaskLists = ko.observableArray([]);
self.TaskLists.push(self.TaskList1);
self.TaskLists.push(self.TaskList2);
};

ko.bindingHandlers.sortable.options = {
placeholder: 'ui-state-highlight',
start: function (e, ui) {
var dragElements = $('.ui-state-highlight');
dragElements.css("height", ui.helper.outerHeight());
}
};
ko.applyBindings(new ViewModel());

CSS

.frame {
padding: 10px;
overflow:auto;
}
.item {
border: black 1px solid;
width: 100px;
background-color: #DDD;
cursor: move;
text-align: center;
margin-top: 2px;
margin-bottom: 2px;
}
.taskList {
width: 110px;
float:left;
background: lightgreen;
}
.Tasks {
width:400px;
border: 1px #eee solid;
height: 100%;
}
.taskName {
word-wrap: break-word;
}
.ui-state-highlight {
background: grey;
border:1px dashed grey;
}

这是我到目前为止得到的 (fiddle) .

除四处移动列表外,一切都按预期工作。移动列表时,我希望可拖动的山墙占位符看起来像:

enter image description here

但我得到的是:

enter image description here

我做错了什么?我怎样才能达到这些预期的结果?

最佳答案

我在睡了一夜好觉后发现了问题。我上面的设计有几个陷阱:

  • 嵌套列表没有 connectClass 来帮助 knockout-sortable 找出可以将元素拖动到哪里。如果不指定,则其中一个列表接受要拖入其中的项目或完整列表。
  • 可拖动占位符的样式与列表本身不同。这就是可拖动占位符未正确呈现的原因(引用我上面问题中的结果截图)
  • 只定义了一个占位符,它同时适用于拖动的项目和拖动的列表,这是不好的。

这是一个fiddle显示完整的工作解决方案。

HTML

<div class="frame">
<ul class="Tasks" data-bind="sortable: {data: TaskLists, connectClass: 'columns', options: { placeholder: 'list-highlight'}}">
<li class="taskList">
<span data-bind="text: Title" style='background: lightgray;'></span>
<ul data-bind="sortable: {data: Tasks, connectClass: 'columnItems', options : { placeholder: 'ui-state-highlight'}}">
<li class="item">
<span class="taskName" href="#" data-bind="text: name"></span>
</li>
</ul>
</li>
</ul>
</div>

JS

var Task = function(name) {
this.name = ko.observable(name);
}

var ViewModel = function() {
var self = this;
self.tasks1 = ko.observableArray([]);
self.tasks2 = ko.observableArray([]);
for (var i=0;i<5;i++){
self.tasks1.push(new Task("This task belongs to list one"));
self.tasks2.push(new Task("This task belongs to list two"));
}
self.TaskList1 = {Tasks: self.tasks1, Title:'List One'};
self.TaskList2 = {Tasks: self.tasks2, Title:'List Two'};
self.TaskLists = ko.observableArray([]);
self.TaskLists.push(self.TaskList1);
self.TaskLists.push(self.TaskList2);
};

ko.bindingHandlers.sortable.options = {
//placeholder: 'ui-state-highlight',
start: function (e, ui) {
var dragItems = $('.ui-state-highlight');
var dragLists = $('.list-highlight');
var elementClass = ui.helper[0].className;
if(elementClass === "item")
dragItems.css("height",ui.helper.outerHeight());
if(elementClass === "taskList")
dragLists.css("height",ui.helper.outerHeight());
}
};
ko.applyBindings(new ViewModel());

CSS

    .frame{
padding: 10px;
overflow:auto;
}

.item {
border: black 1px solid;
width: 100px;
background-color: #DDD;
cursor: move;
text-align: center;
margin-top: 2px;
margin-bottom: 2px;
}

.list-highlight{
width: 100px;
float:left;
background: gray;
}

.taskList{
width: 110px;
float:left;
background: lightgreen;
}

.Tasks{
width:400px;
border: 1px #eee solid;
height: 100%;
}

.taskName{
word-wrap: break-word;
}

.ui-state-highlight{
background: grey;
border:1px dashed grey;
}

关于javascript - knockout 嵌套排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com