Добавить гиперссылку с событием клика в сетку Dojo

Мой вопрос похож на Реализация гиперссылки в сетке данных dojo, и Мне удалось добавить разметку для гиперссылок в сетку Dojo с помощью форматера.

Однако мне нужно подключить события click к этим гиперссылкам, чтобы вызвать функцию в Dijit, содержащую сетку.

У меня есть форматер, подобный следующему:

var createEditLinks = function (data) {
   return '<a class="my-css-class" href="#" onclick="myFunctionInsideTheDijit()">' + data.title + '</a>'
}

Пока это работает (я получаю разметку внутри ячейки сетки), функция myFunctionInsideTheDijit недоступна (если только я не объявлю ее в глобальной области видимости).

Я немного просмотрел dom-construct, но я просто не могу понять, как добавить гиперссылку, которая вызывает функцию Dijit при нажатии.

Любая помощь приветствуется! Спасибо!


person Ted Nyberg    schedule 17.03.2016    source источник


Ответы (2)


Более современным способом сделать это, чем dojo.behavior, было бы использование on и делегирование событий. Экземпляры dgrid уже предоставляют свою собственную функцию on, чтобы сделать это немного проще:

grid.on('a.my-css-class:click', function (event) {
    ...
});
person Ken Franqueiro    schedule 17.03.2016
comment
Фантастика, работает как шарм! Спасибо большое за вашу помощь! - person Ted Nyberg; 17.03.2016
comment
Странно только то, что «event.target» становится внутренним элементом тега привязки, а не самим элементом привязки. - person Ted Nyberg; 17.03.2016
comment
Это ожидаемо; event.target будет самым внутренним элементом, вызвавшим событие. this будет элементом, соответствующим селектору. Это объясняется на странице справочного руководства, на которую я ссылаюсь. - person Ken Franqueiro; 18.03.2016

Я прибегнул к использованию dojo/behavior, чтобы заставить его работать:

// Code inside Dijit's startup function
var that = this;

behavior.add({
    "a.my-css-class": {
        onclick: function (e) {
            e.preventDefault();

            that.myFunctionInsideTheDijit();
        }
    }
});

behavior.apply();

Не уверены, что есть более элегантный способ сделать это? :)

person Ted Nyberg    schedule 17.03.2016
comment
Однако это кажется немного нестабильным, я буду продолжать искать лучшее решение... - person Ted Nyberg; 17.03.2016