2012-05-16 1 views
8

Я пытаюсь создать группу перетаскиваемых объектов DOM с использованием jQuery UI's .draggable(), которые заполняются через подписки Meteor. Код, который я придумал, как выглядитКак правильно привязать поведение jquery ui в метеор?

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' }}); 
     } 
    }; 

Итак, мое мышление, что это изменение в коллекции на капли должны распространяться через паб/подпроцесс и повторно запустить линию .draggable() выше. Но это не похоже.

Полный код для этого можно увидеть здесь https://github.com/sbeam/in-out/blob/master/client/inout.js и приложение жить в http://inout.meteor.com/ (есть и другие, вероятно, не связанные между собой вопросы с пунктами случайно проигрышным значение или исчезающим из пользовательского интерфейса в целом)

Так что, если мое понимание как паб/суб работает в Метеор отключен, было бы хорошо знать. Или существует более эффективный способ достижения этой привязки поведения пользовательского интерфейса, который работает без него?

+0

http://stackoverflow.com/questions/10453291/how-to-trigger-jquery-draggable-on-elements-created-by -templates/10509361 # comment13641878_10509361 – lashleigh

+2

И совсем недавно http://stackoverflow.com/questions/10646570/how-to-handle-custom-jquery-events-in-meteor. Я не уверен, что есть чистый и правильный способ сделать это, но у многих людей есть хаки. – lashleigh

+0

спасибо @lashleigh - поэтому, чтобы суммировать, на данный момент вам нужно прикрепить 'draggable()' или другое поведение при событиях мыши, т. Е. В «последний» возможный момент. Чистый и правильный способ работы с сенсорными экранами будет хорошей областью для активных исследований и вклада. – sbeam

ответ

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

+0

, что кажется правильной стратегией, поэтому, принимая это (но FYI, похоже, есть проблема с drag & drop в вашем приложении, он перестает отвечать) – sbeam

+1

Эй, потрясающе, вы пытаетесь сделать то же самое, что и я! Управление задачами для Github.Метеор, похоже, сильно затягивается, делая другие вещи проще. Я посмотрю ваш проект, желаю вам удачи. Кстати, если вы его заработаете, доска для канбана будет убийцей :) – Milimetric

+2

Проверьте это, у кого-то уже есть что-то вроде канбана, работающего: http://minitrello.meteor.com/ – Milimetric