2013-04-09 12 views
11

Ho alcuni mesi di esperienza nello sviluppo dell'applicazione Web Extjs. Ho riscontrato questo problema:Sovrascrittura delle classi Extjs e richiamo della chiamataParent

Quando eseguo l'override di una classe, ho modificato il metodo, seguito l'implementazione precedente e invocato callParent(). La parte di sostituzione funziona ma lo callParent() ha invocato la vecchia implementazione.

il mio codice di disattivazione

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

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

Il metodo della classe ExtJS per essere sovrascritta:

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

Nella console, posso vedere che primi le nuove stampe Layouter il messaggio seguito dalla vecchia Layouter implementazione ... Inserisco un breakpoint e ripercorro lo stack di invocazione, lo callParent() del nuovo layouter chiamato vecchio. Devo chiamare la classe genitore, ma non il metodo sottoposto a override.

Qualche idea su come risolvere questo problema?

+0

Ci scusiamo per omettere la versione che ho usato, sto usando ExtJs 4.1.2. La risposta scelta è l'approccio corretto ma non ho potuto usarlo, invece ho usato la risposta fornita da @wantok. –

+0

A proposito, bypassare uno dei tuoi supers è un grosso problema, usalo con saggezza e con parsimonia! –

risposta

18

Se stai usando ExtJS 4.1.3 o successiva è possibile utilizzare this.callSuper(arguments) "saltare" il metodo override e chiamare l'implementazione della superclasse.

L'ExtJS documentation per il metodo prevede questo esempio:

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

e commenti:

Il metodo patch non può utilizzare callParent per chiamare il metodo della superclasse dal momento che sarebbe chiamare il metodo override che contiene il bug. In altre parole, la patch di cui sopra produrrebbe solo "Fisso" e "Buono" nel log della console, mentre usando callParent produrrebbe "Fisso" poi "Cattivo" poi "Buono"

3

Non è possibile utilizzare callParent ma è possibile chiamare direttamente il metodo di classe grandparent.

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

Ecco un approccio più generico (anche se un po 'fragile).

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

Penso che questo sia più chiaro poiché mostra la tua intenzione. Specialmente da quando saltare il metodo sovrascritto sembra un trucco –

Problemi correlati