Dojo: Есть ли событие после завершения перетаскивания - PullRequest
1 голос
/ 16 июля 2009

У меня есть два источника dojo.dnd.Source с предметами. Всякий раз, когда предмет уронен, мне нужно сохранить новый порядок предметов в Источниках, используя xhr.

Есть ли событие или тема dojo, которые запускаются после (успешно) завершения операции dnd? Как лучше всего его использовать?

Ответы [ 3 ]

3 голосов
/ 19 июля 2009

Возможно, я не понимаю проблему во всех деталях, но я не понимаю, зачем вам нужно обрабатывать события или темы. Лучший способ записать изменения - перехватить методы обновления в соответствующих источниках. В частности, вам нужно перехватить insertNodes() для капель или любых других дополнений.

Простой пример (псевдокод):

var source1, source2;
// ...
// initialize sources
// populate sources
// ...

function getAllItems(source){
  var items = source.getAllNodes().map(function(node){
    return source.getItem(node.id);
  });
  return items;
}

function dumpSource(source){
  var items = getAllItems(source);
  // XHR items here to your server
}

function recordChange(){
  // now we know that some change has occured
  // it could be a drop or some programmatic updates
  // we don't really care
  dumpSource(source1);
  dumpSource(source2);
}

dojo.connect(source1, "insertNodes", recordChanges);
dojo.connect(source2, "insertNodes", recordChanges);
// now any drop or other change will trigger recordChanges()
// after the change has occurred.

Вы можете попытаться проявить смекалку и отправить некоторую информацию о различиях вместо целого списка, но вы можете сгенерировать ее & mdash; у вас есть все необходимое для этого.

1 голос
/ 16 июля 2009

Вы можете использовать dojo.subscribe, чтобы сделать что-то, когда капля закончена, вот так:

dojo.subscribe("/dnd/drop", function(source, nodes, copy, target) {
  // do your magic here
});

Есть примеры использования подписки на сайте тестирования dojotoolkit . Подробнее о dojo publish и подписаться тоже.

Кроме того, вы можете подключиться к методу onDndDrop.

var source = new dojo.dnd.Source( ... );
dojo.connect( source, "onDndDrop", function( source, nodes, copy, target ) {
  // make magic happen here
});

методы подключения вызываются в конце, поэтому элементы будут там в этот момент.

0 голосов
/ 18 июля 2013

Я храню эту записку для людей из Додзё, таких же, как я, которые столкнулись бы с этой проблемой. Решения, приведенные здесь, не совсем хорошо работали в моей ситуации. Я использовал dijit.tree.dndSource с деревом Dojo, и подписка на «/ dnd / drop» позволяет мне захватить событие, даже если на тот момент мое хранилище данных не было обновлено последними изменениями. Поэтому я попытался ждать, как объясняет Венчни, но это не решает проблему полностью, поскольку я не могу рассчитывать на тайм-аут для выполнения работы ожидания. Время, необходимое для обновления магазина, может варьироваться, т. Е. Короче или очень долго, зависит от сложности вашей структуры данных. Я нашел решение с переопределением метода onDndDrop dndController. Просто вы можете указать onDndDrop: на вашем дереве инициализации. Одна вещь, которую я нашел странным, хотя вы не можете подключить этот метод, вы получите странное поведение во время dnd.

дерево

                this._tree = new MapConfigTree({
                checkAcceptance: this.dndAccept,
                onDndDrop: this.onDndDrop,
                betweenThreshold:5,

способ

            onDndDrop : function(source, nodes, copy, target){
            if(source.dropPosition === 'Over' && (target.targetAnchor.item.type[0] == 'Test layer')) {
                this.inherited(arguments);
                // do your bit here 
            } else {
                this.onDndCancel();
            }   
        }
...