Dojo расширяет dojo.dnd.Source, перемещение не происходит.Идеи? - PullRequest
1 голос
/ 10 июня 2010

УВЕДОМЛЕНИЕ: ЭТО РЕШЕНО, Я ИЗУЧАЮ РЕШЕНИЕ ЗДЕСЬ КАК МОЖНО СКОРЕЕ.

Привет всем,

Хорошо ... У меня есть простая страница додзё с базовыми элементами. Три UL с некоторыми LI в них. Идея заключается в том, чтобы разрешить перетаскивание между ними, но если какой-либо UL станет пустым из-за перетаскивания последнего элемента, я отправлю пользователю сообщение с инструкциями.

Чтобы сделать это, я хотел расширить dijit dojo.dnd.Source и добавить немного интеллекта. Это казалось достаточно легким. Для простоты (я загружаю Dojo из CDN) я просто объявляю свое расширение вместо полной загрузки модуля. Функция объявления здесь ...

function declare_mockupSmartDndUl(){
dojo.require("dojo.dnd.Source");
dojo.provide("mockup.SmartDndUl");
dojo.declare("mockup.SmartDndUl", dojo.dnd.Source, {
    markupFactory: function(params, node){
        //params._skipStartup = true;
        return new mockup.SmartDndUl(node, params);
    },
    onDndDrop: function(source, nodes, copy){
        console.debug('onDndDrop!');    
        if(this == source){
            // reordering items
            console.debug('moving items from us');
            // DO SOMETHING HERE
        }else{
            // moving items to us
            console.debug('moving items to us');
            // DO SOMETHING HERE
        }

        console.debug('this = ' + this );
        console.debug('source = ' + source );   
        console.debug('nodes = ' + nodes);
        console.debug('copy = ' + copy);
        return dojo.dnd.Source.prototype.onDndDrop.call(this, source, nodes, copy);
    }   
});
}

У меня есть функция init, чтобы использовать это для украшения списков ...

dojo.addOnLoad(function(){
declare_mockupSmartDndUl();
if(dojo.byId('list1')){
    //new mockup.SmartDndUl(dojo.byId('list1'));
    new dojo.dnd.Source(dojo.byId('list1'));
}

if(dojo.byId('list2')){
    new mockup.SmartDndUl(dojo.byId('list2'));
    //new dojo.dnd.Source(dojo.byId('list2'));
}

if(dojo.byId('list3')){
    new mockup.SmartDndUl(dojo.byId('list3'));
    //new dojo.dnd.Source(dojo.byId('list3'));
}
});

Ничего страшного, вы заметите, что я оставил "list1" в качестве стандартного источника dojo dnd для тестирования.

Проблема в том, что list1 с радостью примет элементы из списков 2 и 3, которые будут перемещаться или копироваться как назначенные. Однако списки 2 и 3 отказываются принимать элементы из списка1. Это как если бы операция DND отменялась, но отладчик показывает, что происходит dojo.dnd.Source.prototype.onDndDrop.call, а параметры действительно выглядят нормально для меня.

Теперь документация здесь очень слабая, поэтому пример, из которого я взял кое-что из этого, может быть устаревшим (я использую 1.4).

Может кто-нибудь сообщить мне, в чем может быть проблема с моим расширением dijit?

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 июня 2010

Если вы используете загрузчик Dojo XD (используется с CDN), все dojo.require() являются асинхронными.Тем не менее, declare_mockupSmartDndUl() предполагает, что, как только требуется dojo.dnd.Source, оно доступно.Как правило, это не гарантируется.

Еще один придирчивость: dojo.dnd.Source не является виджетом / dijit, хотя его можно использовать в сценариях и можно использовать с разметкой Dojo, он не реализует интерфейсы Dijit.

Теперь проблема - метод, который вы переопределяете, имеет следующее определение в 1.4:

onDndDrop: function(source, nodes, copy, target){
    // summary:
    //      topic event processor for /dnd/drop, called to finish the DnD operation
    // source: Object
    //      the source which provides items
    // nodes: Array
    //      the list of transferred items
    // copy: Boolean
    //      copy items, if true, move items otherwise
    // target: Object
    //      the target which accepts items
    if(this == target){
        // this one is for us => move nodes!
        this.onDrop(source, nodes, copy);
    }
    this.onDndCancel();
},

Обратите внимание, что у него есть 4 аргумента, а не 3. Как вы можете видеть, если вы не передаете 4 th аргумент, onDrop никогда не будет вызван родительским методом.

Исправьте эти две проблемы, и, скорее всего, вы получите то, что хотите.

0 голосов
/ 05 мая 2011
dojo.require("dojo.dnd.Source");
dojo.provide("mockup.SmartDndUl");
dojo.declare("mockup.SmartDndUl", dojo.dnd.Source, {

Оператор Dojo require и оператор Declare находятся рядом со следующим. Я думаю, что это вызовет проблему зависимостей.

оператор dojo require должен выходить за пределы блока onload, а оператор Declare должен находиться в блоке onload.

0 голосов
/ 10 июня 2010

В конце концов, я нажал на IRC в Додзё (великие люди!), И мы закончили (пока) этим ...

    function declare_mockupSmartDndUl(){
    dojo.require("dojo.dnd.Source");
    dojo.provide("mockup.SmartDndUl");
    dojo.declare("mockup.SmartDndUl", dojo.dnd.Source, {
        markupFactory: function(params, node){
            //params._skipStartup = true;
            return new mockup.SmartDndUl(node, params);
        },
        onDropExternal: function(source, nodes, copy){
            console.debug('onDropExternal called...');  

            // dojo.destroy(this.getAllNodes().query(".dndInstructions"));
            this.inherited(arguments);

            var x = source.getAllNodes().length;
            if( x == 0 ){
                newnode = document.createElement('li');
                newnode.innerHTML = "You can drag stuff here!";
                dojo.addClass(newnode,"dndInstructions");
                source.node.appendChild(newnode);
            }

            return true;
            // return dojo.dnd.Source.prototype.onDropExternal.call(this, source, nodes, copy);
        }   
    });
}

И вы можете видеть, куда я направляюсь, я положилв сообщении, когда источник пуст (спецификации клиента, ug!), и мне нужно найти способ убить его, когда что-то перетаскивается (так как по определению оно больше не пусто при входящем перетаскивании!).Эта часть не так хорошо работает.

В любом случае, магия заключалась не в том, чтобы использовать функции onDnd_____, а в функции более высокого уровня, а затем вызывать this.inherited (arguments) для запуска встроенной функциональности.

Спасибо!

...