2015-11-04 65 views
7

我正在嘗試修改web_tree_image小部件。我不想在列中顯示小圖片,而是在懸停或點擊時顯示更大的圖片。爲了達到這個目的,我試圖通過覆蓋start函數來渲染小部件後添加一個回調函數,如the documentation中所解釋的。向web.list.Column的子類中創建的DOM元素添加回調

因此,我下面的代碼添加到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 ...] 
     }, 
     // [...] 
    }); 
}; 

然而,start函數沒有被調用,所以這是行不通的。

我還沒有完全理解代碼路徑,通常會導致start被調用,但它似乎是web.list.Column不知何故不同。

應該調用start,我做錯了什麼?或者在創建DOM元素之後還有另一種執行代碼的方式?

+0

嘗試使用'include'而不是'extend' – ChesuCR

+0

它不適用於'include';另外,[documentation](https://www.odoo.com/documentation/8.0/reference/javascript.html#subclassing-widget)明確指出它應該與'extend'一起工作。 – ValarDohaeris

+0

我不熟悉Odoo,但根據文檔,您必須*使用var my_widget = new MyWidget(this)創建實例*並使用'my_widget.appendTo(「。* some-div 「);' – Anonymous0day

回答

-1

雖然我仍然不知道爲什麼start函數不叫,這是一個解決辦法:

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

通過向事件隊列超時0,執行可以被推遲,直到相關的DOM元素已按解釋here創建。

-1

根據文檔:

新類然後可以通過以下方式被使用:

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

這兩行之後已經執行(和由appendTo返回的任何承諾( )如果需要的話已經解決了),這個小部件已經可以使用了。


注意

的插入方法將啓動widget自己,並且將返回開始的()的結果。

如果由於某種原因您不想調用這些方法,您將必須首先調用控件上的render(),然後將其插入到DOM中並啓動它。

+0

爲什麼downvote? – Anonymous0day

+0

在我的問題中描述的情況下,小部件被實例化爲在xml中定義的樹視圖的一部分(並且實際上將調用引擎蓋下的「appendTo」函數)。請注意,我沒有實例化和看到小部件的問題,問題實際上就是'start'沒有被調用。 – ValarDohaeris