Debian, Dojo, Django, Python

Делюсь опытом в описанных технологиях. Блог в первую очередь выполняет роль памяток для меня самого.

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 реализовано множественное наследование. Если что, это рекомендуемый способ расширения функционала классов и каноничный подход к написанию плагинов.

Комментариев нет :

Отправить комментарий