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类型才是可以执行的。