Я пытаюсь создать группу перетаскиваемых объектов DOM с помощью пользовательского интерфейса jQuery .draggable()
, которые заполняются через подписки Meteor. Код, который я придумал, выглядит следующим образом:
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()
будет Прилагается. По крайней мере, это было моим намерением.
Однако это работает только один раз - после того, как один из этих был перетащен, их больше нельзя перетаскивать.
Когда объекты отбрасываются, я запускаю пользовательское событие, привязанное к Шаблону
для элемента, например так
$( "#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' }});
}
};
Итак, я думаю, что это изменение в коллекции при отбрасывании должно распространиться по процессу pub/sub и повторно запустить строку .draggable()
выше. Но, похоже, это не так.
Полный код для этого можно увидеть здесь https: //github.com/sbeam/in-o ut/blob/master/client/inout.js, а приложение работает по адресу http://inout.meteor.com/(есть некоторые другие, вероятно, не связанные проблемы с элементами, случайно теряющими значения или полностью исчезает из пользовательского интерфейса)
Так что, если мое понимание того, как работает pub/sub в Meteor, не соответствует действительности, было бы неплохо узнать об этом.Или есть более эффективный способ добиться этой привязки поведения пользовательского интерфейса, который работает без нее?