#dojo
#dojo
Вопрос:
У меня есть виджет dojo, который использует код пользовательской библиотеки, имеющий ссылку, подобную этой, в своем шаблоне.
<a href="#" dojoAttachEvent="onclick:_goBack" dojoAttachPoint="backButton">Go Back</a>
Мне нужно найти способ отключить это событие от моего виджета. Единственный известный мне способ отключения события — это использовать
dojo.disconnect(handle)
Я мог бы использовать это, если бы подключил событие с помощью dojo,connect(), который возвращает мне дескриптор.
Однако с dojoAttachEvent у меня нет дескриптора события, следовательно, нет способа отключить его.
Примечание: Изменение этого HTML-кода для меня не вариант, поскольку я использую внешнюю библиотеку.
Кроме того, я не ищу решение для отключения всех событий.
код:
otherWidget.js:
dojo.provide("otherWidget");
dojo.declare("otherWidget", [], {
templateString : dojo.cache("otherWidget","templates/otherWidget.html"),
_goBack: function(){
this.destroyWidgetAndRedirect();
},
destroyWidgetAndRedirect: function(){
//Code to destory and redirect.
},
});
otherWidget.html:
<div>
<a href="#" dojoAttachEvent="onclick:_goBack" dojoAttachPoint="backButton">Go Back</a>
<!-- Other Widget related code -->
...
</div>
myWidget.js:
dojo.provide("myWidget");
dojo.require("otherWidget");
dojo.declare("myWidget", [], {
templateString : dojo.cache("myWidget","templates/myWidget.html"),
this.otherWidget = new otherWidget({}, dojo.byId('otherWidgetContainer'));
});
myWidget.html:
<div>
<div id="otherWidgetContainer"></div>
<!-- My Widget related code -->
...
</div>
Есть мысли..
Спасибо.
Комментарии:
1. Чего именно вы пытаетесь достичь? Запретить выполнение события onClick по умолчанию? Я думаю, вам следует использовать точку расширения _goBack через dojo / метод, если это так. Оно будет иметь событие в качестве первого аргумента, и вы можете использовать evt.preventDefault() в начале вашего переопределяющего кода… Смотрите dojotoolkit.org/reference-guide/quickstart /…
2. Привет, Филипп, спасибо за твой ответ. Да, мой последний мотив — предотвратить событие onClick по умолчанию. Не уверен, правильно ли я понял, но в примере с точкой расширения мне пришлось бы изменить код моей библиотеки, чтобы он вызывал onClick? Кроме того, используя это, даже если я добавлю evt.preventDefault в функцию onClick, _goBack и _onClick все равно будут выполняться перед onClick (как в примере по ссылке). По сути, теперь мой запрос заключается в том, где мне написать код переопределения
Ответ №1:
Точки расширения можно использовать непосредственно в вашем html или в javascript. Предположим, что используемый вами виджет называется «my.custom.dojowidget» и что у него есть точка расширения onClick. Я покажу здесь декларативный способ, в вашем html. Попробуйте это :
<div data-dojo-type="my.custom.widget">
<script type="dojo/method" data-dojo-event="onClick" data-dojo-args"evt">
dojo.stopEvent(evt);
console.debug("did this work ?");
</script>
</div>
Теперь это зависит от существования точки расширения… если вы все еще не можете делать то, что хотите, пожалуйста, опубликуйте соответствующие части кода вашего виджета.
Итак … основываясь на примере кода, который вы опубликовали в своей правке, я думаю, вам следует сделать следующее :
<div data-dojo-type="otherWidget">
<script type="dojo/method" data-dojo-event="destroyWidgetAndRedirect" data-dojo-args="evt">
dojo.stopEvent(evt);
// do whatever custom code you want here...
</script>
</div>
Комментарии:
1. onClick, который я хочу предотвратить, находится в теге привязки, является небольшой частью виджета, который я использую. Этот код предотвращает onClick для всего виджета правильно ..?
2. Правильно … можете ли вы опубликовать здесь соответствующие части кода вашего пользовательского виджета (того, который использует виджет «другой»)? Немного сложно снимать в темноте подобным образом…
3. Я соответствующим образом обновил свой ответ… дайте мне знать, если это сработает, поскольку я не смог это протестировать.
4. Я думаю, я понимаю, что вы пытаетесь сделать. Код в основном переопределяет метод destroyWidgetAndRedirect. Программно написанное выглядело бы примерно так (меня не слишком устраивает декларативный стиль :)) .. this.otherWidget.destroyWidgetAndRedirect = function(evt){dojo.stopEvent(evt);} и это действительно решает проблему. 🙂 спасибо за всю помощь!