2016-04-02 28 views
1

Ben Odoo javascript görünümü akım özelliğinin bu uzantıyı tanımlamış: Javascript - ebeveynleri ebeveynleri süper ara?

openerp.account_move_journal_test = function(instance){ 
    var _t = instance.web._t, 
     _lt = instance.web._lt; 
    var QWeb = instance.web.qweb; 
    instance.web.account.QuickAddListView.include({ 
     init: function(){ 
      this._super.apply(this, arguments); 
      console.log("QuickAddListView modified init") 
     }, 
    });  
}; 

Şimdi daha iyi temsil için ben _super kullanarak denir ebeveynler olan, QuickAddListView ve ListView yılında konsolu günlüğü eklendi. Ben böyle çalıştırırsanız

Yani, bu baskılar almak:

'ListView init' // This is parent of QuickAddListView 
'QuickAddListView Init' 
'QuickAddListView modified init' 

yapıcıları sırasıdır bu View ->ListView ->QuickAddListView

Yani tüm bu olması gerektiği gibi yazdırılır ama istediğim, init'u doğrudan ListView olarak adlandırdığı ve QuickAddListView orijinal init atlamasını sağlayacak şekilde değiştirmektir. yalnızca bu yazdırmalısınız Ondan sonra

(anlam orijinal QuickAddListView init çağrılmadı):

'ListView init' // This is parent of QuickAddListView 
'QuickAddListView modified init' 

aramak istediğiniz tam üst belirtmek için javascript bir yolu var mı? Bu yüzden her şeyin bir zincir içinde olduğunu söylemek yerine, belirttiğiniz yerden başlayacaktır (Benim durumumda ListView'dan itibaren)?

from some_module import SomeBaseClass 

class CustomBase(SomeBaseClass): 
    def m1(self): 
     super(CustomBase, self).m1() 

class Custom(CustomBase): 
    def m1(self): 
     # skip CustomBase 
     super(CustomBase, self).m1() 
+0

Bu thissuper' nereden geliyor? Bu genellikle hiç işe yaramaz. – Bergi

+0

@Bergi, genellikle hiç işe yaramazsa ne demek istiyorsun?Odoo'da kalıtımı taklit etme/bir Python'da olduğu gibi genişletmek için miras olarak kullanılmak üzere kurulmuştur. – Andrius

+0

Ah, [görüyorum] (http://odoo-master.readthedocs.org/en/8.0/howtos/web.html#classes), o zaman Tamam olmalıdır. Yalnızca, her yöntem çağrısı sırasında dinamik olarak ayarlandığında çalışır; tıpkı sizin çerçeveniz tarafından sağlandığı gibi görünür; Bu yaklaşım her durumda sabit bir _super ile çalışmaz. – Bergi

cevap

2

aramak istediğiniz tam üst belirtmek için javascript bir yolu var mı:

Python Örneğin böyle bir şey yapabilir?

Evet, hemen hemen zaten yapıyoruz: açıkça QuickAddListView 'ın init yönteme başvurmak için this._super kullanma.

Her şeyin bir zincirde olduğunu söylemek yerine, belirttiğiniz yerden başlayabilir mi? Ve doğrudan ListView numaralı telefonu arayın ve orijinal init numaralı QuickAddListView numaralı dizini atlayın. Bu durumda İçin

, sadece

instance.web.ListView.prototype.init.apply(this, arguments); 

satır

this._super.apply(this, arguments); 

değiştirmek zorunda ediyorum (veya Odoo konusunda emin değil o sınıfı, erişebilir ancak)

Ama Bu mutlak bir antipattern olarak uyarılır. QuickAddListView'dan devralmak istiyorsanız, yapıcının gereksinim duyduğu özellikleri başlatabilmesi için yapıcısını (veya init yöntemini) çalıştırmalısınız. Eğer bunu herhangi bir nedenden dolayı istemiyorsan, muhtemelen ondan miras almamalısın, ama doğrudan ListView'dan miras almalısın.

+0

Evet, yapıya karşı biraz ilerliyor. Ama bunu istiyorum, çünkü QuickAddListView'da bu şekilde değiştirmek istediğim sadece birkaç işlev var. 'Init' için 'QuickAddListView' içinde bulunan özelliklerin bir kısmını yeniden yazabilirdim, ancak hepsinden değil, çünkü atlanmaya ihtiyacım var. Fakat diğer işlevler için, bunlar orijinal 'QuickAddListView' ile aynı işlevi görmelidir, bu yüzden bunu yapmayı düşünüyorum. İş bilgisayarıma döndüğümde cevabını yarın kontrol edeceğim. – Andrius

+0

"QuickAddListView" öğesini çağırmayı tercih edersiniz ve sonra ihtiyacınız olmayan veya farklı olması gereken özellikleri el ile unset/reset/rafine edin. Bu şekilde, yaptığınız şeyden çok daha açık ve açık. – Bergi

+0

'init' için iyi bir şey değil. Gerçekten QuickAddListView'ü arayabilirim. Fakat diğer yöntemler için (işlevleri kastediyorum) değiştirmem gerek, bunu nasıl yapacağımı bir yol göremiyorum. Yani eğer 'QuickAddListView' denirse, o zaman çok geç olur. Başka bir deyişle, engellemeye çalıştığım bir eylem yapardı. Örneğin, bazı kayıtları oluşturabilir/değiştirebilir. Ama eğer bir işlevi doğrudan 'ListView''den çağırırsam, o zaman belirli eylemi yeniden yazabilirim (' QuickAddListView' içinde yapılması gerekiyordu). Açıkça açıklamış mıyım bilmiyorum. – Andrius