8

我正在尝试使用.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 行为绑定?

4

1 回答 1

4

我在我的应用程序中实现这一点的方式是使用@lashleigh 显示的方法。

我有一个模板事件,它使用如下代码进行侦听:

Template.myDraggableItem.events({
    'mouseover .workItem' : function() {
        $(this._id).draggable();
    }
});

然后我像这样听dragstop。

$('body').on('dragstop', '.myDraggableItem', function (e) {
    // Update the collection with the new position
};

您可以在aduno.meteor.com查看使用此代码的应用程序

于 2012-09-21T21:23:30.660 回答