Переопределение классов 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()
новой планировщика, называемой старой, Мне нужно вызвать родительский класс, но не переопределенный метод.
Любая идея, как решить эту проблему?
Ответы
Ответ 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);