DGrid: обработка onDoubleClick на строке
Разбор
Наткнулся на StackOverflow на вопрос, который давно мучил и меня самого: как в dgrid обрабатывать двойной клик по строке? Встроенного обработчика события onDblClick
в классах библиотеки не было, поэтому я решил посмотреть, можно ли что-то сделать с помощью подручных средств.
Посмотрев код библиотеки, я обнаружил, что у класса Grid
есть методы row()
и cell()
, возвращающие информацию о строке и ячейке соответственно при передаче в качестве параметра события, которое произошло в таблице. Главная сложность была в определении того, на что ставить обработчик. Понятно, что для тысяч строк нельзя вешать onClick()
на каждую строку. В этом случае на контейнер вешают один единственный обработчик, который смотрит на то, от кого пришло событие, и уже тогда что-то делает. Всё оказалось не так уж сложно.
define([
"dojo/_base/declare",
"dojo/_base/lang",
"dgrid/Grid"
], function(declare, lang, Grid){
return declare(Grid, {
onDblClick: function(){
/* Функция-пустышка, которая должна быть заменена на настоящую в классах,
унаследованных от этого. Тут должна быть какая-то работа с переданным
объектом, состоящим из трех полей:
- id - id записи, если есть
- data - полный объект из связанного с таблицей Store
- element - DOM-элемент, на котором случился двойной клик */
},
_onDblClick: function(event){
/* Вызываем onDblClick, передав "чистый" объект с параметрами. Обычно тут
разработчики Dojo Toolkit рекомендуют дополнительно вызывать on.emit с
необходимыми параметрами. На случай, если кто-то ещё должен слушать
события, происходящие в таблице, и как-то на них реагировать */
this.onDblClick(this.row(event));
}, // _onDblClick
postCreate: function(){
// Установка обработчиков на построенную DOM-модель таблицы
this.inherited(arguments);
this.on(".dgrid-content .dgrid-row:dblclick", lang.hitch(this, "_onDblClick"));
} // postCreate
}); // declare
}); //define
Можно пойти дальше и создать класс-расширение, раз уж в Dojo реализовано множественное наследование. Если что, это рекомендуемый способ расширения функционала классов и каноничный подход к написанию плагинов.
Комментариев нет :
Отправить комментарий