Переопределение событий ExtJS и делегирование предыдущей реализации - PullRequest
0 голосов
/ 27 октября 2011

Я унаследовал большую кодовую базу ExtJS3, и существует «базовый» переопределение Extcell до выбора CellEelectionModel. Я усекаю огромные фрагменты кода, но это должно дать общую идею:

Ext.override(Ext.grid.CellSelectionModel, {
    init:function() {
        Ext.grid.CellSelectionModel.superclass.init.apply(this, arguments);

        if (this.unselectableColumns || this.visuallyMimicRowSelection || this.colSpecificHandlers){
        this.on('beforecellselect', function(selModel, rowIndex, columnIndex){
            //etcetera

Впоследствии, однако, мы создаем экземпляр CellSelectionModel и указываем на него прослушиватель beforecellselect следующим образом:

var sm = new Ext.grid.CellSelectionModel({
listeners: {
    beforecellselect : {
    fn: function(selModel, rowIndex, colIndex) {
            //etcetera

Проблема заключается в том, что из прослушивателя нового экземпляра CellSelectionModel мне также необходимо вызвать прослушиватель, определенный в переопределении. Поскольку ExtJS, похоже, сохраняет массив слушателей событий с одинаковыми именами, я могу делегировать его следующим образом:

selModel.events.beforecellselect.listeners[1].fn.apply(selModel, arguments);

Хорошо, я знаю, что не должен жестко кодировать индекс. Но кроме того, есть ли лучший, более ExtJS-й способ сделать это?

1 Ответ

1 голос
/ 27 октября 2011

В вашем случае, если вы знаете, что это будет функция, которая будет использоваться вне конструктора, Я бы предложил добавить функцию обработчика событий в качестве метода CellSelectionModel экземпляр, как показано ниже:

    Ext.override(Ext.grid.CellSelectionModel, {
        init:function() {
            Ext.grid.CellSelectionModel.superclass.init.apply(this, arguments);
            this.customBeforeCellSelect = function(selModel, rowIndex, colIndex) {
                // etcetera
            };
            if (this.unselectableColumns
                || this.visuallyMimicRowSelection
                || this.colSpecificHandlers) {
                this.on('beforecellselect', this.customBeforeCellSelect, this);
            }
    });

    var sm = new Ext.grid.CellSelectionModel({
        listeners: {
            beforecellselect : {
                fn: function(selModel, rowIndex, colIndex) {
                    selModel.customBeforeCellSelect.apply(selModel, arguments);
                },
                scope: sm
            }
        }
    });

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

Из соображений эффективности вы можете переместить пользовательский обработчик в прототип Ext.grid.CellSelectionModel, т. Е. Вместо customBeforeCellSelect для отдельного экземпляра внутри init. Чтобы сделать это возможным, сделайте следующее:

    Ext.grid.CellSelectionModel.prototype.customerBeforeCellSelect =
        function(selModel, rowIndex, colIndex) {
            // etcetera
    };

Вы должны добавить вышеуказанную строку после вашего заявления override.

...