Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Доступ к компоненту из обработчика события его HTML-элемента (https://javascript.ru/forum/extjs/55945-dostup-k-komponentu-iz-obrabotchika-sobytiya-ego-html-ehlementa.html)

khusamov 22.05.2015 05:20

Доступ к компоненту из обработчика события его HTML-элемента
 
Делаю я такой обработчик:

circle.getEl().on("click", "onCircleClick", me);


где circle потомок Ext.container.Container.

И соответственно обработчик создаю:

onCircleClick: function(e, t, eOpts) {
	...	
}


В итоге по клику получаю:

e = как полагается Ext.even.Event, t = ссылка на HTML-элемент, а вот eOpts = {}, то есть пустому объекту. Хотя по инструкции там обещали манну небесную в виде опций http://docs.sencha.com/extjs/5.1/5.1...til.Observable

В общем проблема в том, что мне в обработчике onCircleClick нужно иметь доступ к circle. Как его получить "штатными" средствами Ext?

novikov 22.05.2015 11:55

This object may contain any of the following properties.

При добавлении обработчика, указывется область видимости - me. М.б., добавить circle в свойства этого объекта или в его свойство config?

Или вариант:
var circle = Ext.get(t);

khusamov 22.05.2015 15:26

Странно, но я там прочел следующее:
The options object passed to Ext.util.Observable.addListener.
http://docs.sencha.com/extjs/5.1/5.1...nt-event-click
То есть явно указано, что будет передаваться объект с опциями для метода addListener().

Цитата:

добавить circle в свойства этого объекта
Именно так я сейчас временно и сделал. Но это явно мувитон))) так сказать. Должен быть нормальный способ. Но какой этот способ по задумки Сенчи?

Ext.get не катит. Там на выходе только Ext.dom.Element, а у меня circle это потомок Ext.Component.

novikov 22.05.2015 17:27

А понятно. Эти знания доступны не всем... Но вам расскажу :)

Не нужно извлекать элемент circle.getEl().

Сразу работаете с компонентом.

circle.on("click", "onCircleClick", me, { element: 'el'});

Или

circle.on("click", "onCircleClick", me, { delegate: circle.getEl() });

посмотрите про делегирование:
http://docs.sencha.com/extjs/5.1/5.1...od-addListener

khusamov 22.05.2015 17:39

опля... ну и фокусы вы мне показываете! Ясно, есть чем заняться теперь на следующей неделе))) Видел это, но не использовал. Спасибо!

nohuhu 22.05.2015 21:23

Цитата:

Сообщение от novikov
Или вариант:
var circle = Ext.get(t);

Не-не-не, никогда не вариант. Забудьте эти страшные сказки эпохи Ext 2-3. Делегирование это правильный метод.

А вот ещё добавлю, что в первом варианте у вас eOpts пустое, потому как и не передаёте ничего.

khusamov 23.05.2015 00:12

Пока делегирование не помогло получить доступ именно к компоненту. Так как this у меня меняется на вызывающий no() компонент...

nohuhu 23.05.2015 00:41

А вот кстати до меня сейчас только дошло, что вы присвоение переменной me нигде не показываете. Оно у вас чему равно, и соответственно какой контекст вы в on() передаёте?

khusamov 23.05.2015 03:37

me = this это контекст в котором происходит вызыв метода on()

nohuhu 23.05.2015 03:46

Код покажите. ;)


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