2015-11-04 9 views
7

Ich versuche, das Widget web_tree_image zu ändern. Anstatt nur ein kleines Bild in der Spalte zu zeigen, möchte ich ein größeres Bild beim Schweben oder Klicken anzeigen. Um dies zu erreichen, versuche ich einen Callback hinzuzufügen, nachdem das Widget gerendert wurde, indem ich die start-Funktion außer Kraft setze, wie in the documentation erklärt.Hinzufügen von Rückruf zu DOM-Element erstellt in Unterklasse von web.list.Column

Ich habe deshalb den folgenden Code web_tree_image.js:

openerp.web_tree_image = function (instance) { 
    instance.web.list.Image = instance.web.list.Column.extend({ 
     // [...] 
     start: function() { 
      console.log("start called"); 
      // [... add callbacks ...] 
     }, 
     // [...] 
    }); 
}; 

jedoch die start Funktion nie aufgerufen wird, so dass dies nicht funktioniert.

Ich habe nicht vollständig verstanden, den Code-Pfad, der normalerweise zu start aufgerufen wird, aber es scheint, dass es irgendwie anders für ist.

Sollte start aufgerufen werden und ich mache etwas falsch? Oder gibt es eine andere Art, Code auszuführen, nachdem die DOM-Elemente erstellt wurden?

+0

Versuchen Sie mit 'include' anstelle von' extend' – ChesuCR

+0

Es funktioniert nicht mit 'include' entweder; Außerdem gibt die [Dokumentation] (https://www.odoo.com/documentation/8.0/reference/javascript.html#subclassing-widget) eindeutig an, dass sie mit "extend" arbeiten sollte. – ValarDohaeris

+0

Ich bin nicht vertraut mit Odoo aber nach der Dokumentation müssen Sie * Erstellen Sie die Instanz * mit 'var my_widget = new MyWidget (this);' und * Rendern und Einfügen in DOM * mit 'my_widget.appendTo (". Some-div ");' – Anonymous0day

Antwort

-1

Während ich immer noch nicht wissen, warum die start Funktion nicht aufgerufen wird, ist dies eine Abhilfe ist:

openerp.web_tree_image = function (instance) { 
    instance.web.list.Image = instance.web.list.Column.extend({ 
     // ... 
     format: function (row_data, options) { 
      // ... 
      window.setTimeout(function() { 
       console.log("DOM ready"); 
       // ... add callbacks ... 
      }, 0); 
      // ... 
     }, 
     // ... 
    }); 
}; 

mit Timeout auf die Ereignis-Warteschlange 0 Durch das Hinzufügen, kann die Ausführung, bis die entsprechenden DOM-Elemente aufgeschoben wird wurden wie erklärt here erstellt.

-1

Laut Dokumentation:

Die neue Klasse kann dann auf die folgende Weise verwendet werden:

// Create the instance 
var my_widget = new MyWidget(this); 
// Render and insert into DOM 
my_widget.appendTo(".some-div"); 

Nach diesen beiden Linien ausgeführt haben (und jedes Versprechen von appendTo zurück () wurde bei Bedarf behoben), das Widget kann verwendet werden.


Hinweis

die Einfügungsverfahren wird das Widget selbst starten, und wird das Ergebnis der start() zurückkehren.

Wenn Sie aus irgendeinem Grund diese Methoden nicht aufrufen möchten, müssen Sie zuerst render() auf dem Widget aufrufen, dann fügen Sie es in Ihr DOM ein und starten es.

+0

Warum der Downvote? – Anonymous0day

+0

In dem in meiner Frage beschriebenen Fall wird das Widget als Teil einer Baumansicht instanziiert, die in xml definiert ist (und tatsächlich die Funktion "appendTo" unter der Haube aufrufen wird).Beachten Sie, dass ich kein Problem habe, das Widget zu instanziieren und zu sehen, das Problem ist nur, dass 'start' nicht aufgerufen wird. – ValarDohaeris