Доступ к компоненту из обработчика события его 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? |
This object may contain any of the following properties.
При добавлении обработчика, указывется область видимости - me. М.б., добавить circle в свойства этого объекта или в его свойство config? Или вариант: var circle = Ext.get(t); |
Странно, но я там прочел следующее:
The options object passed to Ext.util.Observable.addListener. http://docs.sencha.com/extjs/5.1/5.1...nt-event-click То есть явно указано, что будет передаваться объект с опциями для метода addListener(). Цитата:
Ext.get не катит. Там на выходе только Ext.dom.Element, а у меня circle это потомок Ext.Component. |
А понятно. Эти знания доступны не всем... Но вам расскажу :)
Не нужно извлекать элемент 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 |
опля... ну и фокусы вы мне показываете! Ясно, есть чем заняться теперь на следующей неделе))) Видел это, но не использовал. Спасибо!
|
Цитата:
А вот ещё добавлю, что в первом варианте у вас eOpts пустое, потому как и не передаёте ничего. |
Пока делегирование не помогло получить доступ именно к компоненту. Так как this у меня меняется на вызывающий no() компонент...
|
А вот кстати до меня сейчас только дошло, что вы присвоение переменной me нигде не показываете. Оно у вас чему равно, и соответственно какой контекст вы в on() передаёте?
|
me = this это контекст в котором происходит вызыв метода on()
|
Код покажите. ;)
|
Вот кусок кода:
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"); }, |
Нашел решение:
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(): Цитата:
Правда смутил тот факт, что написано appended, а на самом деле prepended. То есть параметр circle мне пришлось вставить ВНАЧАЛЕ, а не в конце, как того предприсывает инструкция. Почему так??? |
Цитата:
|
Цитата:
|
Складировать не надо, любая ошибка или непонятность в документации - это баг. У нас в команде два человека выделено на документацию, только этим и занимаются. Открывайте тикеты, они пофиксят.
Конкретно этот баг я уже открыл, а на будущее просто открывайте сообщение в официальном форуме, техподдержка откроет тикет и дальше по процедуре. |
Цитата:
И никто до сих пор не может объяснить данное явление, даже те, у кого доступ имеется. Поэтому я и подзабил на это дело. Я не знаю способа иного как открывать тикеты. |
Доступа нет куда? И где вы этот доступ запрашивали?
Регистрация на форуме бесплатная, доступ к открытым разделам тоже. Открыть тикет в нашей JIRA напрямую у вас не получится, поэтому просто открывайте новую тему в форуме с описанием проблемы, ребята из техподдержки её прочитают и откроют за вас тикет. Они там специально для этого сидят. |
Цитата:
Я им писал об этом. Но они не отвечают. |
Странно. Какой у вас в том форуме юзернейм? Я попинаю форумщиков.
|
khusamov
|
Ok, проверим. На всякий случай, вам регистрационный e-mail приезжал, когда вы на форуме регистрировались? Очень похоже, что вы эккаунт не активировали.
|
Слава богам, мне открыли доступ на запись! ))) Давненько я не брал в руки шашки... попробуем)))
|
Митч утверждает, что ваш эккаунт не был активизирован. Хорошо, что всё получилось. :)
|
Цитата:
Ладно, до конца года есть время наверстать упущенное)))) |
Про техподдержку не могу сказать, не знаю, куда вы писали. А по поводу ошибки, я просто в своё время админил форум на базе движка vBulletin, и такие проблемы, как у вас, случались довольно часто. Поэтому и ситуация знакомая. :)
Навёрстывайте, ждём багрепортов хороших и разных. :) |
Часовой пояс GMT +3, время: 04:00. |