Ele*_*ena 3 html5 knockout.js durandal-2.0
我有一个淘汰赛js视图模型中的照片列表,我希望能够在它们之间交换(实际上更正确的术语是复制一个在另一个之上).这是我简化的viewmodel:
define(['durandal/app', 'knockout', 'jquery'], function(app, ko, jquery) {
var miscPhotos = ko.observableArray();
var draggedPhoto = ko.observable();
function handleDragStart(data, e) {
// e.preventDefault();
draggedPhoto(data);
console.log('dragStart');
return true;
}
function handleDragOver(e) {
e.preventDefault();
console.log('dragOver');
}
function handleDrop(e) {
e.preventDefault();
e.stopPropagation();
console.log('drop');
}
return {
miscPhotos: miscPhotos,
handleDrop: handleDrop,
handleDragOver: handleDragOver,
handleDragStart: handleDragStart
}
});
Run Code Online (Sandbox Code Playgroud)
还有简化的UI:
<div id="holder" data-bind="foreach: miscPhotos">
<div class="pull-left well well-small" draggable="true"
data-bind="event:{
dragstart: function(data, e){ $root.handleDragStart($data, e);},
dragover:function(data, e){ $root.handleDragOver( e);},
drop:function(data, e){ $root.handleDrop(e, $data);}}
">
<div class="thumb">
<img class="thumb"
title="" style="display: block"
data-bind="attr: {src: 'data:image;base64,' + PhotoData()}"
/>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
当我尝试将一张照片复制到另一张照片之上时,只有dragstart事件触发,dragover和drop才会触发.
解:
您需要在dragstart定义中添加return true:
dragstart: function(data, e){ $root.handleDragStart($data, e); return true;},
Run Code Online (Sandbox Code Playgroud)
更多信息:
dragover没有被触发,因为Knockout阻止了dragstart的默认操作,如果没有默认操作,就不会有从dragstart到dragover的转换.
我想你试图通过在这里添加'return true'来启用默认操作:
function handleDragStart(data, e) {
// e.preventDefault();
draggedPhoto(data);
console.log('dragStart');
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是,由于您绑定事件的方式,您需要做的事情(这是最快的修复)是将'return true'移动到绑定中的内联函数:
dragstart: function(data, e){ $root.handleDragStart($data, e); return true;},
Run Code Online (Sandbox Code Playgroud)
我认为这将为你解决.但是,如果您愿意,可以稍微简化您的代码.您没有在事件绑定中传递内联函数的任何额外参数,因此您实际上不需要内联函数.您可以按原样提供视图模型功能:
dragstart: $root.handleDragStart,
dragover: $root.handleDragOver,
drop: $root.handleDrop
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您需要更改处理程序函数签名以使用Knockout约定(data,event):
handleDragStart(data, e)
...
handleDragOver(data, e)
...
handleDrop(data, e)
Run Code Online (Sandbox Code Playgroud)
我做了一个小提琴来测试这个......我不得不重写你的视图模型,我跳过了依赖语句只是因为没有它就更容易做一个小提琴.但是代码与你的代码基本相同,所以希望你能够阅读它.我还在视图模型中添加了一些测试数据URL,因此有一个可用的演示.
当我在那里时,我还继续展示如何在handleDrop函数中将照片中的数据拖入您放入的照片中,从而实现将一张照片复制到另一张照片的目标:
// The next 3 lines shows how you can copy the dragged photo onto the dropped target...
var context = ko.contextFor(e.target);
var index = context.$index();
this.miscPhotos()[index].PhotoData(this.draggedPhoto().PhotoData());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2641 次 |
| 最近记录: |