ExtJS - Как ссылаться на «себя» в пользовательской функции в пользовательском классе? - PullRequest
2 голосов
/ 22 июня 2011

Как мне ссылаться на экземпляр пользовательского класса внутри пользовательской функции, определенной в классе?

Я расширил класс с помощью «механизма» расширения классов ExtJS4, и у меня есть пользовательский обработчик событий, который будет вызываться, когда что-то срабатывает, и я хочу свернуть Panel, когда что-то срабатывает.

Однако в обработчике событий класса Reactor ниже «this» ссылается на EventTriggerer (Firer события) вместо экземпляра Reactor. Как мне сослаться на экземпляр EventReactor внутри пользовательской функции?

Спасибо! DashK

Ext.define('EventReactor', {
    extend: 'Ext.panel.Panel',
    onSomething: function(data) {
        // ERROR
        // this.collapse is undefined. "this" actually references EventTriggerer
        this.collapse();
    }
});

Ext.define('EventTriggerer', {
    extend: 'Ext.util.Observable',
    singleton: true,
    constructor: function() {
        this.addEvents({
        "changedView" : true
    });
},
doSomething: function() {
    // Do some stuff
    this.fireEvent("doneSomething", data);
    }
});

...

// Here's how the listeners are added
var er = Ext.create('EventReactor');
EventTriggerer.addListener("doneSomething", er.onSomething);

// Here's how the event is triggered.
er.doSomething();

Ответы [ 2 ]

9 голосов
/ 03 декабря 2012

Вы должны создать вложенную область для хранения «this» во время выполнения конструктора:

Ext.define('EventReactor', function() {
    var self;  // This is a variable to store "this"

    return {
        extend: 'Ext.panel.Panel',

        constructor: function() {
            self = this;  // Here you store "this" in the closure
            self.callParent(arguments);
        },

        onSomething: function(data) {
            // ERROR
            // this.collapse is undefined. "this" actually references EventTriggerer
            // this.collapse();

            // Using "self" instead of "this" => No error
            self.collapse();
        }
    };
});

Подробная информация (см. Метод определения): http://docs.sencha.com/ext-js/4-1/#!/api/Ext

0 голосов
/ 22 июня 2011

Метод addListener () имеет дополнительный параметр scope, который можно установить для объекта, который в обработчике событий становится this.

EventTriggerer.addListener("doneSomething", er.onSomething, er);
...