Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Как изменить DD статус? (https://javascript.ru/forum/extjs/27095-kak-izmenit-dd-status.html)

Ex_Soft 02.04.2012 16:23

Как изменить DD статус?
 
Хочу проверять существование перетаскиваемого объекта в получателе и изменять статус с dropAllowed на dropNotAllowed ежели оный уже существует.
var
    alreadyExists = function(target, data) {
        var
            text = data.records[0].get("text"),
            el = Ext.fly(target),
            exists = el.select(".appended");

        return Ext.Array.some(exists.elements, function(item, index, allItems) {
                    return item.innerHTML == text;
            });

    },
    dropZone = Ext.create("Ext.dd.DropZone", dropTarget, {
        ddGroup: "tree2div",

        getTargetFromEvent: function(e) {
            return e.getTarget("div.drop-target");
        },

        notifyEnter: function(ddSource, e, data) {
            return !alreadyExists(this.getTargetFromEvent(e), data) ? Ext.dd.DropZone.prototype.dropAllowed : Ext.dd.DropZone.prototype.dropNotAllowed;
        },
                                
        onNodeEnter: function(target, source, e, data) {
            source.proxy.setStatus(!alreadyExists(target, data) ? Ext.dd.DropZone.prototype.dropAllowed : Ext.dd.DropZone.prototype.dropNotAllowed);
        },
                                
        /*notifyOver: function(ddSource, e, data) {
            return !alreadyExists(this.getTargetFromEvent(e), data) ? Ext.dd.DropZone.prototype.dropAllowed : Ext.dd.DropZone.prototype.dropNotAllowed;
        },*/

        onNodeOver: function(target, source, e, data) {
            return !alreadyExists(target, data) ? Ext.dd.DropZone.prototype.dropAllowed : Ext.dd.DropZone.prototype.dropNotAllowed;
        },
                                
        onNodeDrop: function(target, dd, e, data) {
            if(alreadyExists(target, data))
                return false;

            var
                text = data.records[0].get("text"),
                el = Ext.fly(target);

            Ext.DomHelper.append(el, { tag: "div", html: text, cls: "appended" }) ;
                                    
            return true;
        }
    });

Посредством notifyOver/onNodeOver - все работает. Но они ж дергаются на каждое дергание мыши, а вместе с ними, соответственно, и alreadyExists(). notifyEnter/onNodeEnter же - дергаются один раз. Но попытки изменить в них статус - тщетны. Как можно, если, таки, можно, заюзать notifyEnter/onNodeEnter?

nekto_O 03.04.2012 07:56

честно говоря не сталкивался с подобной реализацией ДД и не совсем понимаю суть проблемы
notifyEnter отрабатывает при входе в dropZone так ведь?

notifyEnter: function(ddSource, e, data) {
    return !alreadyExists(this.getTargetFromEvent(e), data) ? this.dropAllowed : this.dropNotAllowed;
},


а source.proxy.setStatus у вас правельно отрабатывает в onNodeEnter? Во всяком случае статус изменяется если принудительно проставлять...

Ex_Soft 03.04.2012 08:50

Цитата:

Сообщение от nekto_O (Сообщение 166651)
честно говоря не сталкивался с подобной реализацией ДД и не совсем понимаю суть проблемы

Суть проблемы такова: когда буксируемый элемент входит в target показывается иконка dropAllowed. Я же хочу, в случае уже существования, показывать иконку dropNotAllowed дабы глупый пингвин юзвер не удивлялся тому, что элемент убегает обратно к себе домой в дерево. Превентивные меры, так сказать...
Цитата:

Сообщение от nekto_O (Сообщение 166651)
notifyEnter отрабатывает при входе в dropZone так ведь?

Да. И notifyEnter, и onNodeEnter вызываются, но, вот, их телодвижения не возымеют действия. Хотя, проверял debugger'ом,
Цитата:

Сообщение от nekto_O (Сообщение 166651)
source.proxy.setStatus у вас правельно отрабатывает

отрабатывает.

P.S. А то, что их двое (и notifyEnter, и onNodeEnter) - то я уже от "...безсилої люті...", так сказать... Конечно, в итоге, нужно юзать что-то одно...
P.P.S. BTW, так и не постиг задлянафига и notifyX и onNodeX и что и когда юзать по феншую...

nekto_O 04.04.2012 11:43

Цитата:

Сообщение от Ex_Soft
Посредством notifyOver/onNodeOver - все работает. Но они ж дергаются на каждое дергание мыши, а вместе с ними, соответственно, и alreadyExists().

Подтверждаю, так и есть. Собственно не нашел ничего лучше чем:
...
locked: false,
...
onNodeOver : function(target, dd, e, data) {
    ....
    return !this.locked ? this.dropAllowed : this.dropNotAllowed;
},

notifyEnter: function(ddSource, e, data) {
    this.locked = alreadyExists(this.getTargetFromEvent(e), data);
    ...
}


понимаю что это в некотором роде извращение, но лучшего варианта не нашел, по крайней мере здесь alreadyExists отрабатывать будет только при входе в дропзону, а не при каждом перемещении драг-элемента.

Ex_Soft 04.04.2012 12:03

Цитата:

Сообщение от nekto_O (Сообщение 166958)
понимаю что это в некотором роде извращение

Вот и я ж о чем...
/me думает: шо ж это они так неаккуратненько-то с Enter'ом...


Часовой пояс GMT +3, время: 01:31.