2016-04-02 10 views
1

ich diese Erweiterung der aktuellen benutzerdefinierten definiert haben Javascript Ansicht in Odoo:Javascript - Anruf Super Eltern Elternteil?

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

Jetzt bessere Darstellung hinzugefügte E Konsolenprotokoll in QuickAddListView und in ListView, die Eltern sind, die _super genannt verwenden.

Also, wenn ich es so laufen lasse, erhalte ich diesen Druck:

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

Die Reihenfolge der Konstrukteure ist dieses View ->ListView ->QuickAddListView

So alles das gedruckt wird, wie es sollte , aber was ich will, ist, init in einer Weise zu ändern, dass es direkt ListView aufrufen und QuickAddListView Original überspringen würde.

nach so, dass es nur diese gedruckt werden soll (was bedeutet, original QuickAddListView init hieß nicht):

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

Gibt es eine Möglichkeit in Javascript genau Elternteil Sie anrufen möchten, angeben? Anstatt also anzurufen, dass alles in einer Kette ist, würde es von wo aus beginnen (wie in meinem Fall von ListView)?

Zum Beispiel in Python können Sie etwas tun:

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

Woher kommt 'this._super'? Dies funktioniert normalerweise nie. – Bergi

+0

@Bergi was meinst du normalerweise funktioniert nie?Es ist in Odoo eingebaut, um für die Vererbung verwendet zu werden, um Vererbung/Erweiterung wie zum Beispiel in einem Python zu imitieren. – Andrius

+0

Ah, [ich sehe] (http://odoo-master.readthedocs.org/en/8.0/howtos/web.html#classes), sollte dann in Ordnung sein. Es funktioniert nur, wenn es bei jedem Methodenaufruf dynamisch festgelegt wird, so wie es von Ihrem Framework bereitgestellt wird. Dieser Ansatz funktioniert nicht mit einer konstanten '_super' in jeder Instanz. – Bergi

Antwort

2

Gibt es eine Möglichkeit in Javascript genau Elternteil Sie anrufen möchten, angeben?

Ja, ich ist so ziemlich schon, das zu tun: this._super Verwendung ausdrücklich QuickAddListView ‚s init Verfahren zu verweisen.

Also anstatt zu nennen, dass alles in einer Kette ist, würde es beginnen, wo Sie angeben? Und rufen Sie direkt ListView und überspringen QuickAddListView Original init.

Für diesen Fall würden Sie nur die Linie

this._super.apply(this, arguments); 

von

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

ersetzen (oder aber Sie diese Klasse zugreifen können, nicht sicher Odoo)

Aber gewarnt werden, dass dies eine absolute Antipattern. Wenn Sie von QuickAddListView erben möchten, sollten Sie seinen Konstruktor (oder init Methode) ausführen, damit es die Eigenschaften initialisieren kann, die es benötigt. Wenn Sie das aus irgendeinem Grund nicht möchten, sollten Sie wahrscheinlich nicht von ihm erben, sondern direkt von ListView erben.

+0

Nun ja, es geht ein bisschen gegen die Struktur. Aber ich möchte das, weil es nur wenige Funktionen in QuickAddListView gibt, die ich auf diese Weise ändern möchte. Für 'init' würde ich einige der Eigenschaften, die sich in' QuickAddListView' befinden, neu schreiben, aber nicht alle, weil ich einige überspringen muss. Aber für andere Funktionen sollten diese genauso funktionieren wie in der ursprünglichen 'QuickAddListView', weswegen ich darüber nachdachte. Ich überprüfe deine Antwort morgen, wenn ich zurück zu meinem Arbeits-PC komme. – Andrius

+0

Ich denke, Sie sollten lieber die 'QuickAddListView' aufrufen und dann manuell die Eigenschaften zurücksetzen/zurücksetzen/verfeinern, die Sie nicht brauchen oder anders sein müssen. Auf diese Weise ist es viel expliziter und offensichtlicher, was Sie wirklich tun. – Bergi

+0

Gut für 'init' ist es keine große Sache. Ich könnte 'QuickAddListView' wirklich nennen. Aber für andere Methoden (ich meine Funktionen) muss ich modifizieren, ich sehe keinen Weg wie ich das machen kann. Ich meine, wenn ich es von 'QuickAddListView' ausrufe, wäre es zu spät. Mit anderen Worten, es würde eine Aktion machen, die ich verhindern möchte. Zum Beispiel würde es einen Datensatz erstellen/modifizieren. Aber wenn ich irgendeine Funktion direkt von 'ListView' aufrufen würde, könnte ich eine bestimmte Aktion umschreiben (was in' QuickAddListView' geschehen soll). Ich weiß nicht, ob ich das klar erklärt habe. – Andrius

Verwandte Themen