【问题标题】:Why doesn't ondrop fire in Knockout data-bind为什么在 Knockout 数据绑定中不会触发 ondrop
【发布时间】:2023-03-07 02:31:01
【问题描述】:

我正在尝试使用 Knockout JS 进行拖放,但无法使其工作。有什么建议吗?

<td data-bind="event: {ondrop: $root.HandleDrop}">

【问题讨论】:

  • 你试过drop而不是ondrop吗?
  • 我有,但没有火。
  • 您的浏览器是否支持拖放事件?
  • ondrop 我们在文档中提到了这个事件吗?与我们分享更多代码。欢呼
  • @James 是的,我正在运行最新版本的 Chrome。

标签: knockout.js


【解决方案1】:

如 cmets 中所述,您必须创建自定义绑定处理程序才能实现此目的

查看模型:

(function() {
    var _dragged;
    ko.bindingHandlers.drag = {
        init: function(element, valueAccessor) {
            var dragElement = $(element);
            var dragOptions = {
                helper: 'clone',
                revert: true,
                revertDuration: 0,
                start: function() {
                    _dragged = ko.utils.unwrapObservable(valueAccessor().value);
                },
                cursor: 'default'
            };
            dragElement.draggable(dragOptions).disableSelection();
        }
    };

    ko.bindingHandlers.drop = {
        init: function(element, valueAccessor) {
            var dropElement = $(element);
            var dropOptions = {
                drop: function(event, ui) {
                    valueAccessor().value(_dragged);
                }
            };
            dropElement.droppable(dropOptions);
        }
    };
})();
var ViewModel = function () {
    var self = this;
    self.user = ko.observableArray([{name:'jhon'},{name:'charlie'},{name:'jack'}]);
    self.movedArray=ko.observableArray()
    self.latestone = ko.computed({
        read: function() {
            return self.movedArray().length ? self.movedArray()[0] : "";
        },
        write: function(value) {
            self.movedArray.unshift(value); // adds as first element in array 
        },
        owner: self
    });
};

$(function() {
    ko.applyBindings(new ViewModel());
});

查看:

<ul id="dragbox" data-bind="foreach:user">
    <li data-bind="text:$data.name,drag:{value:$data.name}"></li>
</ul>

<hr/>
<div id="dropbox" data-bind="drop: {value: latestone}">
        <div data-bind="visible:(!!latestone())">
            <p >Thanks for adding <span data-bind="text:latestone"></span>!</p>
            <span>So far, you've added:</span>
            <ul data-bind="foreach: movedArray">
                <li data-bind="text: $data"></li>
            </ul>
        </div>
    </div>
<hr/>

工作小提琴here

感谢wilsonhut 我只是用他的小提琴来做这个。

【讨论】:

  • 在我上面提到的文档中它说:“这可以用来绑定到任何事件,例如按键、鼠标悬停或鼠标悬停。”为什么我必须创建自定义绑定处理程序?
  • 是的,不能同意更多。它是个人Choice 我觉得使用绑定处理程序是更好的做法,它可以更好地控制你所做的事情(即复杂的逻辑),请参考文档以防万一。
  • 现在我尝试了这个:,HandleUnwantedEvents 现在执行 event.preventDefault。 HandleDrop 没有改变,我真的达到了!
  • 很高兴听到。这篇文章可能会有所帮助(jquery 中的事件)stackoverflow.com/questions/6199890/…。欢呼
猜你喜欢
相关资源
最近更新 更多
热门标签