【发布时间】:2012-05-14 06:16:32
【问题描述】:
我在 Html 文件中有一个标准模板,例如:
<template name="cards">
{{#each all_cards}}
{{> card_item}}
{{/each}}
</template>
<template name="card_item">
<div class="card" style="left:{{position.x}}px; top:{{position.y}}px">
{{title}}
</div>
</template>
我想让卡片(css 选择器.card)可以用 JQuery 拖动。 现在,由于 Meteor 使用模板自动更新 DOM,我何时以及如何知道在何处调用 .draggable() ??
编辑:到目前为止,这是我的解决方案,它通过摆动动画(使用 CSS3)使其他客户端上的待处理动作可见:
Template.card_item.events = {
'mouseover .card': function (e) {
var $target = $(e.target);
var $cardContainer = $target.hasClass('card') ? $target : $target.parents('.card');
$cardContainer.draggable({containment: "parent", distance: 3});
},
'dragstart .card': function (e) {
Session.set("dragging_id", e.target.id);
$(e.target).addClass("drag");
pos = $(e.target).position();
Events.insert({type: "dragstart", id:e.target.id, left: pos.left, top: pos.top});
},
'dragstop .card': function (e) {
pos = $(e.target).position();
Events.insert({type: "dragstop", id:e.target.id, left: pos.left, top: pos.top});
Cards.update(e.target.id, {$set: {left:pos.left, top:pos.top}});
Session.set("dragging_id", null);
}
}
Events.find().observe({
added: function(event) {
if (event.type == "dragstart" && !Session.equals("dragging_id", event.id)) {
$("#"+event.id).draggable({disabled: true});
$("#"+event.id).addClass("wobble");
}
if (event.type == "dragstop" && !Session.equals("dragging_id", event.id)) {
$("#"+event.id).animate({left: event.left, top: event.top}, 250);
Events.remove({id:this.id});
$("#"+event.id).draggable({disabled: false});
}
}
});
【问题讨论】:
-
使用
Meteor.defer,它不在文档中,但这个问题解释了它。我目前正在使用它来制作可排序的列表,并且效果很好。 stackoverflow.com/questions/10109788/… -
谢谢,我去看看! - 很酷,这很有效!
-
干杯,不客气。另外,我刚刚了解到meteor.defer 只是setTimeout 的一个包装器,在控制台中输入
Meteor.defer,不带任何参数来理解我的意思。 -
我查了一下,很有趣....
-
好的,看更新,
Meteor.defer不应该在这种情况下使用..
标签: meteor