Dojo dnd (перетаскивание) 1.7.2 - Как поддерживать отдельный (не dojo-dnd) список?

Я использую Dojo dnd версии 1.7.2, и в целом он работает очень хорошо. Я счастлив.

Мое приложение поддерживает множество массивов элементов, и когда пользователь перетаскивает элементы, мне нужно следить за тем, чтобы мои массивы обновлялись, чтобы отражать содержимое, которое видит пользователь.

Чтобы добиться этого, я думаю, мне нужно запустить некоторый код примерно во время Source.onDndDrop

Если я использую dojo.connect для настройки обработчика в моем источнике для onDndDrop или onDrop, мой код, кажется, вызывается слишком поздно. То есть source, переданный обработчику, на самом деле больше не содержит элемент.

Это проблема, потому что я хочу вызвать source.getItem(nodes[0].id), чтобы получить фактические данные, которые перетаскиваются, чтобы я мог найти их в своих массивах и обновить эти массивы, чтобы отразить изменения, которые вносит пользователь.

Возможно, я ошибаюсь; а есть способ лучше?


person Harold    schedule 10.07.2012    source источник


Ответы (2)


Хорошо, я нашел хороший способ сделать это. В этом ответе на другой вопрос был найден намек: https://stackoverflow.com/a/1635554/573110

Моя успешная последовательность звонков в основном такова:

var source = new dojo.dnd.Source( element, creationParams );
var dropHandler = function(source,nodes,copy){
  var o = source.getItem(nodes[0].id); // 0 is cool here because singular:true.
  // party on o.data ...
  this.oldDrop(source,nodes,copy);
}
source.oldDrop = source.onDrop;
source.onDrop = dropHandler;

Это гарантирует, что новая реализация onDrop (dropHandler) вызывается прямо перед ранее установленной.

person Harold    schedule 11.07.2012

Кажется, я стреляю в пустоту, есть несколько разных реализаций dndSource. Но есть некоторые вещи, которые нужно знать о событиях/функциях проверки, которые вызываются во время наведения мыши/dnddrop.

Один из подходов — настроить checkAcceptance(source, nodes) для любой цели, которая у вас может быть. Затем сохраните ссылку на перетаскиваемые узлы. Однако становится сложно с несколькими контейнерами с динамическим содержимым.

Настройте свой источник, переопределив checkAcceptance и используйте известную (возможно, глобальную) переменную для отслеживания.

var lastReference = null;
var target = dojo.dnd.Source(node, {
    checkAcceptance(source, nodes) : function() {
        // this is called when 'nodes' are attempted dropped - on mouseover
        lastReference = source.getItem(nodes[0].id)
        // returning boolean here will either green-light or deny your drop
        // use fallback (default) behavior like so:
        return this.inhertied(arguments);
    }
});

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

dojo.subscribe("/dnd/drop", function(source, nodes, copy, target) {
  // figure out your source container id and target dropzone id
  // do stuff with nodes
  var itemId = nodes[0].id
}

Механики/темы, доступные через dojo.subscribe, и события перечислены здесь http://dojotoolkit.org/reference-guide/1.7/dojo/dnd.html#manager

person mschr    schedule 11.07.2012
comment
Спасибо за ответ. Я ценю помощь. Я не знаю, что вы подразумеваете под несколькими различными реализациями dndSource... Можете ли вы уточнить? Я использую тот, что в Source.js. Техника .subscribe имеет ту же проблему, которую я описал в своем вопросе. Если моя подписка вызывается после встроенной, элемент уже удален из источника. Я не хочу, чтобы моя программа зависела от порядка обратных вызовов. - person Harold; 11.07.2012
comment
есть API-интерфейс dnd, специфичный для dijit.Tree, есть некоторые в dojox.. Это dojo/dnd/Source? В любом случае, реализуйте dndSource.checkAcceptance (источник, узлы), затем заполните пустое поле. - person mschr; 13.07.2012
comment
о, не заметил вашего ответа ниже: p - person mschr; 13.07.2012