2012-01-11 65 views
5

我正在尋找一種方法來覆蓋一些openerp web js核心功能,如「on_logout」。openerp web客戶端6.1:如何覆蓋基本的javascript函數

該文檔缺乏的指令(你可以在my post看到)和helloworld module告訴你,你可以不喜歡它

openerp.web_hello = function(openerp) { 

openerp.web.SearchView = openerp.web.SearchView.extend({ 
    init:function() { 
     this._super.apply(this,arguments); 
     this.on_search.add(function(){console.log('hello');}); 
    } 
}); 

// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them 

openerp.web.Login = openerp.web.Login.extend({ 
    start: function() { 
     console.log('Hello there'); 
     this._super.apply(this,arguments); 
    } 
}); 

}; 

在我的模塊,我這樣做:

openerp.mytest = function(openerp){ 

    openerp.web.WebClient = openerp.web.WebClient.extend({ 
     on_logout: function() { 
      alert('mine'); 
      [...] 
     }, 
    }); 
} 

我知道js已經加載,因爲在此定義之外放置警報有效。

這裏有什麼問題?

回答

4

,因爲你要改變的原型,是一個有點特別的問題(類,如果你願意),這是已經實例化對象的(一個WebClient的實例是系統的根,所以它可能已經在你的代碼被加載的時候,因此創建一個新的WebClient「類」不會改變現有的實例)。

在這種情況下,您不能用子類替換類,您必須重新打開類(類似於Ruby),因爲類對象上有一個include方法,其中應該工作:

openerp.mytest = function(openerp) { 
    openerp.web.WebClient.include({ 
     on_logout: function() { 
      alert('mine'); 
      this._super.apply(this, arguments); 
     } 
    }); 
} 

(如紅寶石,this._super勢必要替換的方法,如果有的話,就地改建類)

如果檢查view_list_editable.js實現文件,它提供了一些示例,因爲它需要重新打開並更改列表視圖的代碼i n爲了添加可編輯性。

+1

嗨,謝謝你的回答。我只是試過這個,但沒有工作。它繼續使用原來的。 FWIW我剛剛推出了最新版本。 – simahawk 2012-01-11 11:13:04

+1

哦,我忘記了這是一個「回調」('on_ *'和'do_ *'方法在'init'期間直接綁定到實例,如果類以某種方式擴展了'openerp.web.CallbackEnabled'),並且在任何模塊被加載之前,'WebClient'被實例化。你唯一的解決方案是使用原始的javascript,並訪問'openerp.webclient'(這個會話的webclient實例,如果有的話)並直接修改它。就像'openerp.webclient.on_logout.add_first(function(){console.log('my logout')});'工作。替換on_logout可能不會起作用,因爲事件受到熱切(一個壞主意)的約束。 – xmo 2012-01-11 12:50:25

+0

我嘗試:openerp.mytest =函數(OpenERP的){ openerp.webclient.on_logout.add_first( '!thatsme' 函數(){ 警報();} );但它似乎也沒用::( – simahawk 2012-01-11 13:57:02