2012-09-14 22 views
10

Göreceli olarak büyük bir ExtJS MVC uygulamasında yaklaşık> 40 Denetleyici,> 100 Mağaza,> 100 Model vb. Üzerinde çalışıyorum. Mümkün olan MVC yolunu takip etmiyorum, bu yüzden kontrol cihazını ilk olarak ihtiyaç duyulduğunda ve böylece depoları başlatan bir temassız denetleyici başlatması gerçekleştirdim. Ayrıca herhangi bir denetleyicide herhangi bir görünüm kaydetmiyorum, ancak bu sadece ihtiyacım yok.Profil Nasıl Yapılır (Hata ayıklama) ExtJS EventPipe/Olaylar

Şimdi, formlar (bir Ext.window.Window içinde açılan), hemen hemen küçük bir proje içinde aynı form açılırken ortaya çıkana kadar yaklaşık 1-2 saniye sürer. Bu yüzden form (düzen), beni olaylara getiren şey sorun olamaz. Ama gerçekten en iyi yolun nasıl olacağını bilmiyorum ya da nasıl yapılacağını iyi bir öğretici var. Tüm borunun ne kadar sürdüğünü (sadece EventPipe'ın değil) görmek için bunu profillemek güzel olurdu.

Olay yapısı:

olayların çoğu sorumlu kumandanın control() yoluyla kayıtlı olsun. Diğer tüm etkinlikler en fazla { single: true } ile kayıtlıdır. Yeniden kullanıldığında pencereler kapanır ve yeniden takılır.

+1

Btw, denetleyicileri doğru şekilde temizliyor musunuz? Bir denetleyiciyi yok ederseniz, EventBus üzerindeki dinleyiciler çerçeve tarafından temizlenmez. Üzgünüz, sorunuza bir cevap değil, ilgili. – mistaecko

+0

@mistaecko Bu ek bilgi için teşekkür ederiz! Bu bilmek gerçekten çok güzel! Ama şu anda başlatıldıkları zaman kontrolörleri geri dönüştürmüyorum, bu yüzden hiçbir etkisi olmayacaktır. Kaynak koduna baktığımdan kontrolörler, ApplicationController'ın dahili bir koleksiyonunda saklanır. Ama sanırım olay gönderilerinizi basit bir şekilde görüntülemekle bitmiyor – sra

+1

Denetleyicilerinizi temizlemeye karar verdiyseniz, denetleyicileri nasıl yok edeceğime dair cevabımı buradan kontrol edin: http://stackoverflow.com/questions/12330846/how- to-delete-controller-extjs/12344788 # 12344788 – mistaecko

cevap

6

Korkarım ama ExtJS herhangi bir etkinlik profili oluşturmuyor. Özel etkinlik sistemi kullanıyor.

Bu sorunun çözümünü burada görüyorum.

sevk ve çerçeve olayları göndermek için tek nokta sağlayan çerçeve ve Ext.app.EventBus kullanılan herhangi bir olay (FireEvent sadece Ext.app.EventBus.dispatch yöntemi için sarıcı) işleme işlevselliği sağlar Ext.util.Event sınıfı vardır.

Sınıflar özeldir, bu nedenle kaynak kodunu görmenizi öneririz.

Bunu EventProfiler olması gerekiyordu Ext.app.EventBus.dispatch yöntemini çağırarak ve bunun gibi Ext.util.Event.fire yöntemi Tavsiyen (içinde olay dinleyicisi çağıran aldığı ne kadar görmek için bu sınıfları geçersiz edebilirsiniz kendi sınıf)

Ext.app.EventBus

dispatch: function (/* event name or Ext.util.Event */event, /* Target class */ target, args) { 
    //start timing 
    var start = new Date(); 

    /* ... */ 

    for (i = 0, ln = events.length; i < ln; i++) { 
     event = events[i]; 
     // Fire the event! 
     if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) { 
      return false; 
     } 
     // start event profiling 
     // here we are sure that event is dispatched and it's instance of Ext.util.Event 
     EventProfiler.startProfile(event, /* time passed from dispath method started */new Date() - start); 
    } 

    /* rest of dispatch method call */ 
} 

Ext.util.Event

fire: function() { 
    /* ... */ 
    if (listener.o) { 
     args.push(listener.o); 
    } 

    EventProfiler.endProfile(this); 

    if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) { 
     return (me.firing = false); 
    } 

    /* ... */  

} 
+0

Aklımda olan buydu. Ama ben kaynak koduna ayrıntılı bir şekilde bakmamıştım, sadece EventBus'a hızlı bir bakış. Bunu pazartesi günü test edeceğim. Yine de iyi cevap +1 – sra

+0

Bulgularınızla çok ilgileniyorum. Belki sonuçlarınızı SO ya da Sencha forumlarında yayınlayabilirsiniz! – mistaecko

+0

Sorumlu fonksiyonları prototiplemek için ilk hızlı testleri yaptım ve şu ana kadar iyi görünüyor. Henüz bir profiler üzerinde çalışmaya devam etmek için zamanım yok ama biraz zaman bulduktan sonra bu konuya geri döneceğim. Ve evet @mistaecko Burada sonucu yayınlayacağım. – sra