Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Задать scope для обработчика события drop весьма затруднительно (https://javascript.ru/forum/extjs/56715-zadat-scope-dlya-obrabotchika-sobytiya-drop-vesma-zatrudnitelno.html)

khusamov 30.06.2015 19:48

Задать scope для обработчика события drag весьма затруднительно
 
Я пытаюсь сделать обработчик события drag:

draggable: {
	listeners: {
		drag: "onDrag"
	}
},

onDrag: function() {...}


Но это не работает.

Воспользоваться initComponent нельзя, так как объект draggable не существует, а dd запрещен документацией. Да и вообще, как выяснилось, объект dd не доступен в initComponent... он доступен после события boxready.

И как мне в таких условиях задать scope?

khusamov 30.06.2015 21:27

После серии экспериментов выяснилось, что если установить draggable: true, то в компоненте будет вызываться метод onDrag, если он определен. Странное поведение какое-то.

Причем метод onDragEnd или onDragend не вызывается, хотя по логике должен.

siber-biber 30.06.2015 21:59

можно и в initComponent scope задать https://fiddle.sencha.com/#fiddle/pmg

bastrakov 02.07.2015 16:18

давно уже не делал разных драгов, но если чего-то нет в initComponent, потому что оно еще не отрисовано, то оно уже есть в afterRender. а листенеры можно накладывать с помощью .on("onDrag"...

nohuhu 02.07.2015 22:44

@bastrakov,

Не надо ничего делать в afterRender, особенно не надо инициализировать Drag'n'Drop. Всё это нужно делать в onBoxReady.

Почему, спросите вы? А всё просто: afterRender вызывается сразу после того, как компонент отрендерен в DOM, но до раскладки (layout). Делать что-либо с DOM в afterRender чревато forced reflow, а это очень больно в IE8 и на таблетках.

onBoxReady вызывается после того, как компонент первый раз прошёл через layout, и размеры элементов уже известны. Чтение/запись в DOM (в разумных пределах) не вызовет reflow, и проблем не будет.

khusamov 04.07.2015 09:20

Проблема в том, чтобы в onBoxReady что-то задать, нужно воспользоваться объектом this.dd, который в документации отсутствует. Что весьма печально... А ведь уже приходится пользоваться, так как иных вариантов не нашел.


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