OE模塊中都可以自定義js或修改官方的js內容,之前一直不明白自定義的js方法是在哪裏進行初始化的。昨天爲了追蹤一個問題,仔細閱讀了oe的js核心處理腳本,對自定義模塊js的初始化有了一個初步瞭解,現記錄如下,以供參考。
假設自定義模塊名爲“vnsoft”,如果模塊需要有js,則在模塊中需要定義如下目錄結構:
addons/vnsoft/static/src/js/ js文件名隨便取,假設爲data.js
在data.js中,代碼格式爲:
openerp.vnsoft = function(instance){
--自定義js內容
}
其中openerp.vnsoft中的"vnsoft"就是模塊名稱,這兩者要一致,不然無法初始化。
js文件建立好以後,需要告訴openerp在啓動時加載,這個是在模塊的__openerp__.py文件中定義,如:
{
'js' : ["static/src/js/data.js"],
}
OE在啓動時,如果模塊有安裝,則會加載指定的js文件內容,但這個時候還只是加載了一個定義,並沒有初始化。初始化動作是在addons/web/static/src/js/boot.js中處理的,其中有一段代碼如下:
for(var i=0; i < modules.length; i++) {
new_instance[modules[i]] = {};
if (openerp[modules[i]]) {
openerp[modules[i]](new_instance,new_instance[modules[i]]);
}
}
這段就是判斷如果模塊名稱是一個有效的對象,則調用此方法,並傳入實例對象作爲參數,這裏的 new_instance,就會對應到模塊定義中方法的形參instance。這個時候你的自定義方法就執行了,如果對系統內核的方法有擴展,這個時候就會生效。
因爲這裏modules數組都是模塊的名稱,所以前面我們才說爲什麼js中的openerp.vnsoft後面的部分要跟模塊名稱一致。
這裏有一個小疑問就是,上面的if條件只是判斷openerp[modules[i]]有效,並不是判斷對象類型是否爲function,正確來講應該只有function類型纔是可以執行的。
原文;http://blog.csdn.net/vnsoft/article/details/17953641