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

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

khusamov 23.05.2015 19:15

Вот кусок кода:

onUpdatePolylineControlled: function(type, points) {
		if (type == "add") {
			var me = this;
			points.forEach(function(point) {
				point = me.getSurface().getMatrix().transformPoint(point.toArray());
				var circle = me.add(me.getConfigCircle(point));

				circle.getEl().dom._circle = circle; // Временное решение проблемы

				circle.getEl().on("click", "onCircleClick", me);
			});
		}
},
	
onCircleClick: function(e, t, eOpts) {
		
		var circle = t._circle; // Временное решение проблемы
		
		var me = this;
		e.stopEvent();
		var index = me.items.indexOf(circle);
		if (index == 0) me.fireEvent("close");
},

khusamov 23.05.2015 19:24

Нашел решение:

onUpdatePolylineControlled: function(type, points) {
		if (type == "add") {
			var me = this;
			points.forEach(function(point) {
				point = me.getSurface().getMatrix().transformPoint(point.toArray());
				var circle = me.add(me.getConfigCircle(point));

				circle.getEl().on("click", "onCircleClick", me, {
					args: [circle]
				});
			});
		}
},
	
onCircleClick: function(circle, e, t, eOpts) {
		
		var me = this;
		e.stopEvent();
		var index = me.items.indexOf(circle);
		if (index == 0) me.fireEvent("close");
},


Использовал эту фичу метода on():

Цитата:

http://docs.sencha.com/extjs/5.1/5.1...iner-method-on
args : Array (optional)
Optional arguments to pass to the handler function. Any additional arguments passed to fireEvent will be appended to these arguments.

Правда смутил тот факт, что написано appended, а на самом деле prepended. То есть параметр circle мне пришлось вставить ВНАЧАЛЕ, а не в конце, как того предприсывает инструкция. Почему так???

nohuhu 26.05.2015 19:51

Цитата:

Сообщение от khusamov (Сообщение 372070)
Правда смутил тот факт, что написано appended, а на самом деле prepended. То есть параметр circle мне пришлось вставить ВНАЧАЛЕ, а не в конце, как того предприсывает инструкция. Почему так???

Может быть потому, что аргументы fireEvent добавляются к args, а не наоборот? Хотя вообще согласен, документация мутновата. Открыл тикет.

khusamov 26.05.2015 21:28

Цитата:

Может быть потому, что аргументы fireEvent добавляются к args, а не наоборот?
Все может быть, но в инструкции желательно такие мутности не писать конечно. У них раньше там была возможность комментария оставлять для потомков, а теперь такого нету... не знаю даже куда сохранять теперь эт находки... пока открыл группу вконтакте, и туда складирую. А то ведь и самому пригодится - память не резиновая.

nohuhu 27.05.2015 01:49

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

Конкретно этот баг я уже открыл, а на будущее просто открывайте сообщение в официальном форуме, техподдержка откроет тикет и дальше по процедуре.

khusamov 27.05.2015 14:44

Цитата:

Открывайте тикеты, они пофиксят.
У меня регистрация есть, а вот доступа нет. Я запрашивал доступ - но они даже просто на письма не отвечают, не то чтобы доступ дать.

И никто до сих пор не может объяснить данное явление, даже те, у кого доступ имеется. Поэтому я и подзабил на это дело.

Я не знаю способа иного как открывать тикеты.

nohuhu 27.05.2015 21:13

Доступа нет куда? И где вы этот доступ запрашивали?

Регистрация на форуме бесплатная, доступ к открытым разделам тоже. Открыть тикет в нашей JIRA напрямую у вас не получится, поэтому просто открывайте новую тему в форуме с описанием проблемы, ребята из техподдержки её прочитают и откроют за вас тикет. Они там специально для этого сидят.

khusamov 28.05.2015 15:43

Цитата:

Доступа нет куда? И где вы этот доступ запрашивали?

Регистрация на форуме бесплатная,
Ну да, я там как раз и зарегистрирован. Но у меня нет прав доступа для создания тем и написания ответных постов. Даже нет доступа на чтение некоторых разделов.

Я им писал об этом. Но они не отвечают.

nohuhu 28.05.2015 21:57

Странно. Какой у вас в том форуме юзернейм? Я попинаю форумщиков.

khusamov 29.05.2015 00:22

khusamov

nohuhu 29.05.2015 01:13

Ok, проверим. На всякий случай, вам регистрационный e-mail приезжал, когда вы на форуме регистрировались? Очень похоже, что вы эккаунт не активировали.

khusamov 29.05.2015 15:57

Слава богам, мне открыли доступ на запись! ))) Давненько я не брал в руки шашки... попробуем)))

nohuhu 29.05.2015 20:19

Митч утверждает, что ваш эккаунт не был активизирован. Хорошо, что всё получилось. :)

khusamov 30.05.2015 02:33

Цитата:

Сообщение от nohuhu (Сообщение 373146)
Митч утверждает, что ваш эккаунт не был активизирован. Хорошо, что всё получилось. :)

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

Ладно, до конца года есть время наверстать упущенное))))

nohuhu 30.05.2015 08:53

Про техподдержку не могу сказать, не знаю, куда вы писали. А по поводу ошибки, я просто в своё время админил форум на базе движка vBulletin, и такие проблемы, как у вас, случались довольно часто. Поэтому и ситуация знакомая. :)

Навёрстывайте, ждём багрепортов хороших и разных. :)


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