Подтвердить что ты не робот

Переопределение классов Extjs и вызов callParent

У меня есть несколько месяцев опыта разработки веб-приложения Extjs. Я столкнулся с этой проблемой:

Когда я переопределяю класс, я модифицировал метод и следил за предыдущей реализацией и вызывал callParent(). Завершающая часть работает, но callParent() вызвала старую реализацию.

мой главный код

Ext.override(Ext.layout.component.Draw, {
    finishedLayout: function (ownerContext) {

        console.log("new layouter being overriden");
        this.callParent(arguments);
    }
});

Метод класса Extjs, который должен быть переопределен:

finishedLayout: function (ownerContext) {
    var props = ownerContext.props,
        paddingInfo = ownerContext.getPaddingInfo();

    console.log("old layouter being overriden");
    this.owner.setSurfaceSize(props.contentWidth - paddingInfo.width, props.contentHeight - paddingInfo.height);

    this.callParent(arguments);
}

В консоли я вижу, что сначала новый указатель распечатывает сообщение, за которым следует старая реализация layouter... Я поставил точку останова и восстановил стек вызовов, callParent() новой планировщика, называемой старой, Мне нужно вызвать родительский класс, но не переопределенный метод.

Любая идея, как решить эту проблему?

4b9b3361

Ответ 1

Если вы используете ExtJS 4.1.3 или новее, вы можете использовать this.callSuper(arguments) для "пропустить" переопределенный метод и вызвать реализацию суперкласса.

Документация ExtJS для метода предоставляет этот пример:

Ext.define('Ext.some.Class', {
    method: function () {
        console.log('Good');
    }
});

Ext.define('Ext.some.DerivedClass', {
    method: function () {
        console.log('Bad');

        // ... logic but with a bug ...

        this.callParent();
    }
});

Ext.define('App.paches.DerivedClass', {
    override: 'Ext.some.DerivedClass',

    method: function () {
        console.log('Fixed');

        // ... logic but with bug fixed ...

        this.callSuper();
    }
});

И комментарии:

Метод патча не может использовать callParent для вызова метода суперкласса, поскольку это вызовет переопределенный метод, содержащий ошибку. Другими словами, вышеприведенный патч будет производить только "Fixed", а затем "Good" в журнале консоли, тогда как с помощью callParent будет создаваться "Fixed", затем "Bad", затем "Good"

Ответ 2

Вы не можете использовать callParent, но вы можете просто вызвать метод класса grandparent непосредственно.

GrandparentClass.prototype.finishedLayout.apply(this, arguments);

Здесь более общий (если несколько хрупкий) подход.

this.superclass.superclass[arguments.callee.$name].apply(this, arguments);