2013-04-09 20 views
11

Mam kilka miesięcy doświadczenia w tworzeniu aplikacji internetowej Extjs. Wpadłem na ten problem:Przesłanianie klas Extjs i wywoływanie funkcji callParent

Kiedy nadpisuję klasę, zmodyfikowałem metodę i wykonałem poprzednią implementację i wywołałem callParent(). Nadrzędna część działa, ale callParent() odwołał się do starej implementacji.

mój kod nadrzędny

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

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

Metoda klasy ExtJS być przesłonięta:

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); 
} 

W konsoli, widzę, że pierwsze nowe wydruki Layouter z komunikatem następnie starego Layouter implementacja ... Umieściłem punkt przerwania i odtworzyć stos wywołania, callParent() nowego layoutera zwanego starym. Muszę wywołać klasę nadrzędną, ale nie metodę nadpisaną.

Każdy pomysł, jak rozwiązać ten problem?

+0

przykro opuszczone wersję z którego korzystałem, używam ExtJs 4.1.2. Wybrana odpowiedź jest poprawna, ale nie mogłem jej użyć, zamiast tego skorzystałem z odpowiedzi udzielonej przez @wantok. –

+0

Nawiasem mówiąc, omijanie jednego z twoich superów to wielki hack, używaj go mądrze i oszczędnie! –

Odpowiedz

18

Jeśli używasz ExtJS 4.1.3 lub później można użyć this.callSuper(arguments) do „skip” metodę zastąpiona i nazywają nadklasę realizację.

ExtJS documentation dla metody zapewnia poniższym przykładzie:

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(); 
    } 
}); 

i komentarze:

Metoda patch nie może używać callParent wywołać metodę klasy nadrzędnej ponieważ nazwałbym zastąpiona metodą zawierającej pluskwa. Innymi słowy, wyżej łatka będzie produkować tylko „Fixed”, a następnie „Good” w dzienniku konsoli, podczas gdy przy użyciu callParent będzie produkować „Fixed”, a następnie „zły”, a następnie „dobre”

3

Nie można używać callParent, ale można po prostu bezpośrednio wywołać metodę klasy dziadka.

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

Oto bardziej ogólne (choć nieco kruche) podejście.

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

Myślę, że jest to bardziej przejrzyste, ponieważ pokazuje Twoją intencję. Szczególnie, że pomijanie nadpisanej metody wygląda na włamanie –

Powiązane problemy