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