我正在尝试使用.draggable()
通过 Meteor 订阅填充的 jQuery UI 创建一组可拖动的 DOM 对象。我想出的代码看起来像
Meteor.subscribe('those_absent', function() {
$( "li.ui-draggable" ).draggable( { revert: "invalid" } );
});
Meteor.subscribe('those_present', function() {
$( "li.ui-draggable" ).draggable( { revert: "invalid" } );
});
这些与一些Meteor.publish()
调用相对应,因此任何时候集合发生变化,.draggable()
行为都会被附加。至少,这是我的意图。
然而,它只能工作一次——一旦其中一个<li>
被拖放,那么它们就不再是可拖动的了。
当对象被删除时,我正在触发一个附加到Template
项目的自定义事件,如下所示
$( "#c_absent .inner-drop" ).droppable({
drop: function( event, ui ) {
ui.draggable.trigger('inout.leave');
}
});
Template.loftie_detail.events = {
'inout.leave': function (e) {
Lofties.update({_id:this._id}, {$set: {present: 'N' }});
}
};
因此,我的想法是,对 drop 集合的这种更改应该通过 pub/sub 进程传播并重新运行.draggable()
上面的行。但它似乎没有。
可以在此处查看完整代码https://github.com/sbeam/in-out/blob/master/client/inout.js并且该应用程序位于http://inout.meteor.com/(那里其他一些可能与项目随机丢失值或完全从 UI 中消失的问题无关)
因此,如果我对 Meteor 中 pub/sub 如何工作的理解不正确,那么很高兴知道。或者有没有更有效的方法来实现没有它的 UI 行为绑定?