Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

Js初探



  • 最近准备通过js来对oe的页面做一些默认没有的效果,先研究下页面的按钮要怎么样才能调用到js方法;
    研究的思路如下:
    1、先要让js文件加载到页面;
    2、初始化js的对象;
    3、按钮的方法要能调用到js的对象的方法;这里有两种路径,一种是页面的按钮经过后台的python方法调用js方法,一种是在页面的按钮上定义onclick事件,直接调用;

    碰到的问题如下:
    1、通过在__openerp__.py文件中定义js,是可以加载js文件的,但是发现js文件加载到页面后,并没有初始化;

    解决办法:
    1、经过@深圳-Tommy的提醒,在js中定义的对象,必须和模块名相同;
    2、如果要页面的按钮上添加onclick事件,需要在按钮外面包<html>标签。

    老规矩,附上代码:
    openerp.py中的js文件引入:

    {...<br />&nbsp; &nbsp; &quot;installable&quot; : True,&nbsp; # 可否安装&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &#039;auto_install&#039;: False,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &quot;category&quot;:u&#039;保险&#039;,&nbsp; # 模块类型<br />&nbsp; &nbsp; &#039;js&#039;: &#91;&#039;static/src/js/syt_insurance222.js&#039;,],<br />}
    


    js类定义如下:

    openerp.syt_insurance = function(instance) {<br />	instance.web.client_actions.add(&#039;bt_start&#039;, &#039;instance.syt_insurance.btn_start&#039;);<br />	instance.syt_insurance.btn_start = function() {<br />		var self = this;<br />		alert(&#039;test&#039;);<br />		return false;<br />	};<br />};<br />function aaa(){<br />	alert(123);<br />}<br />
    


    页面调用,通过python方法:

    &lt;button name=&quot;call_js&quot;&nbsp; groups=&quot;base.group_erp_manager&quot;&nbsp; string=&quot;调用js方法&quot; type=&quot;object&quot;/&gt;
    


    页面调用,直接通过onclick:

    &lt;html&gt;<br />	&lt;input type=&quot;button&quot; value=&quot;获得设备代码&quot; onclick=&quot;aaa(this)&quot; class=&quot;oe_button oe_form_button_save&quot;/&gt;<br /> &lt;/html&gt;
    


    python类中定义的方法:

    def call_js(self, cr, uid, ids,context=None): <br />&nbsp; &nbsp; &nbsp; &nbsp; context={}<br />&nbsp; &nbsp; &nbsp; &nbsp; context[&quot;key&quot;]=&quot;value&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; print &quot;call——js...&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; ret = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;type&#039;: &#039;ir.actions.client&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;tag&#039;: &#039;bt_start&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;context&#039;: context,<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; return ret
    




  • openerp.syt_insurance,其中的syt_insurance必须是模块名,否则,这里定义的js对象是不会初始化的。我就是在这个地方浪费了好多事件啊。。。再次感谢Tommy



  • 干货! 必须顶, 已经 “喝彩”



  • 感谢梦姑的分享,让好多新人少走了弯路,赞一个!希望后续再多多分享宝贵的经验,嘿嘿



  • 多谢阿狸的提醒,把python中的定义的方法补充了一下


  • 管理员

    谢谢lz分享,上面展示的是两种触发js的方法吧?一个是通过python代码调用ir.actions.client,另外一种是直接在代码里面插入<html></html>标签?



  • 很棒,知道原理比像我这样误打误撞效率高得多,不愧是前端老手!



  • 想搞js的初级选手,来这里https://github.com/figol/web_scanner; 大牛直接跳过。



  • 谢谢分享,
    Mark.



  • 但是我用工作流的button的事件去调call_js方法,不行。有什么办法能解决吗?



  • [quote author=puyu link=topic=16514.msg29841#msg29841 date=1421206640]
    但是我用工作流的button的事件去调call_js方法,不行。有什么办法能解决吗?
    [/quote]

    这个问题基本解决了。但是如何给js传参的呢?比如把form当前记录的id传给js



  • [quote author=panyi5202 link=topic=16514.msg28524#msg28524 date=1405937743]
    openerp.syt_insurance,其中的syt_insurance必须是模块名,否则,这里定义的js对象是不会初始化的。我就是在这个地方浪费了好多事件啊。。。再次感谢Tommy
    [/quote]

    谢谢,不过我这里出现了一个问题,我新建了个模块,加入js,但是怎么也调不到。。,在view里写xml