OE模塊中js方法初始化


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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章