2011-02-08 29 views
5

ExtJS'de birden çok devralma ile ilgili bir sorum var. Biliyorum, ancak bunu yapmak için kodu çoğaltabilirim, ancak kodu daha etkili bir şekilde kodlamak için herhangi bir yol olup olmadığını bilmek istiyorum.Extjs çoklu kalıtım mı?

Çerçevemde Kore.ux.grid.GridPanel adlı özelleştirilmiş bir GridPanel bileşen var. Ek işlevler ile Ext.GridPanel'u genişletir ve REST eylemleri için arabirim sağlar. Kısa bir süre sonra, meslektaşım EditorGridPanel numaralı telefonun aynı şekilde uygulanmasını istiyordu, yani düzenlenebilir olmasını istiyor ve aynı zamanda REST eylemlerini kolayca gerçekleştirebiliyor.

Sorum şu ki, Kore.ux.grid.GridPanel işlevlerini özelleştirilmiş hale getirmek için Ext.EditorGridPanel numaralı telefonu genişletebileceğim herhangi bir yol var mı?

Herhangi bir dilbilgisi hatası için üzgünüz ve kafa karıştırıyorsa onu yeniden yazabilirim. Teşekkürler!!

DÜZENLEME

Tekrar googled ve bunun imkansız diyerek konuları bulundu. Bu sorunu yaşamaya devam etmem gerekirse daha iyi bir kodlama modeli var mı?

Teşekkürler!

DÜZENLEME TEKRAR

Ben İşte bana faydası bulunan yöntemdir .. bana uygun yapıyı bulduk çok üzgünüm:

var Common = function(){} //abstract class 
Ext.apply(Common.prototype, { 

    a : function(){}, 
    b: function(){}... 

}); 

Ext.ux.SomePanelA = Ext.extend (Ext.Panel, { 

    stuff : ............ 

}); 

Ext.ux.SomePanelB = Ext.extend (Ext.Panel, { 

    diffStuff : ............ 

}); 

Ext.applyIf(Ext.ux.SomePanelA.prototype, Common.prototype); 
Ext.apply(Ext.ux.SomePanelB.prototype, Common.prototype); 

Kod Kaynak: http://www.sencha.com/forum/showthread.php?48000-multiple-inheritance&p=228271&viewfull=1#post228271

Lütfen tekrar Daha iyi bir çözümün olduğunu düşünüyorsanız, yararlı öneriler sağlayın :) Teşekkürler! Genel işlevsellik ile temel sınıf olarak Kore.ux.grid.AbstractGridPanel oluşturun

cevap

5

Gerçekten neye bakmanız gerekiyorsa, ExtJS eklentileridir.

/** 
* Boilerplate code taken from 'ExtJS in Action' by Jay Garcia 
*/ 
YourNameSpace.RestGridPlugin = Ext.extend(Object, { 
    constructor : function(config) { 
    config = config || {}; 
    Ext.apply(this.config); 
    }, 

    init : function(parent) { //parent argument here, is whatever you apply your plugin to 
    parent.on('destroy', this.onDestroy, this); 
    Ext.apply(parent, this.parentOverrides); 
    }, 

    onDestroy : function() { 
    //here you need to free any resources created by this plugin 
    }, 

    parentOverrides : { 
    //here you do your magic (add functionality to GridPanel) 
    } 

}); 

Ext.preg('restgridplugin',YourNameSpace.RestGridPlugin); //register your brand ne plugin 

Kullanımı

someGrid = { 
    xtype: 'grid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 

someEditorGrid = { 
    xtype: 'editorgrid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 
+0

PLUGIN! Neden varlığını unuttum !! Öneri için teşekkürler :) Bunu çerçeveye nasıl dahil edeceğimi göreceğim.Teşekkürler :) –

+0

Ama benim kişisel GridPanel özelleştirilmiş pagingToolbar, önceden tanımlanmış düğmeleri, arama kutusu, REST ... vb Plugin sağlayabilir gibi benim durumumda uygun olmayabilir :) Plugin yolu olmayabilir :) Öneriniz için zaten teşekkürler! –

+0

Neden olmasın? Bu özel bileşenleri, işlevselliklerini onlara bağlamak için eklenti içinden erişebilirsiniz. Sonuçta, eklentinin yaptığı şey aslında 'Ext.apply() 'sadece şimdi yaptığınız şekilde. Sadece bunun için biraz daha sağlam ve kullanımı kolay bir API ekliyor. – Mchl

0

. Ve iki alt sınıf oluşturun: Kore.ux.grid.GridPanel ve Kore.ux.grid.EditorGridPanel (özel işlevlerle birlikte).

+0

seyredin, 'Ext.grid.EditorGridPanel'' Ext.grid.GridPanel', DİNLENME uzanır Sağladığım "interface", "Ext.grid.GridPanel" uzantısını genişletiyor ve 'Ext.grid.EditorGridPanel' dosyasında sağlanan işlevselliklere ihtiyacım olduğu için, en iyi yolun ortak bir temel sınıf yazıp, her iki "Ext. .GridPanel' ve ortak temel sınıf ile birlikte Ext.grid.EditorGridPanel'. Yine de giriş için teşekkürler :) –

0

Ben Ext birden devralma gerçekleştirmek için Plugins kullanarak katılmıyorum. Eklentiler, davranış değiştirmeyi veya yeni işlevler eklemeyi amaçlamaktadır.

çoklu mirası ulaşmak için doğru yol Katmalar kullanmaktır, şeydir bu şaşırtıcı bir açıklama SenchaCon 2011: The Sencha Class System

Ext.define('FunctionalityA', { 
    methodA: function() { 
     ... 
    } 
}); 

Ext.define('FunctionalityB', { 
    methodB: function() { 

    } 
}); 

Ext.define('MultipleFunctionality', { 
    mixins: [ 
     'FunctionalityA', 
     'FunctionalityB' 
    ], 

    method: function() { 
     methodA(); 
     methodB(); 
    } 
});