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

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

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

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

[分享]OpenERP Web Client 事件处理源码初探



  • OpenERP Web Client 事件处理源码初探<br /><br />昨天(2013-09-22)在检查 sale.order  的 子表 sale.order.line product_id 中获取 context 传递丢失的问题时, <br />需要了解一下 OpenERP 7.0 Web 模块的Javascript 源码.<br />得群中 成都-gotham(30943392) 提示, 初略地了解了一下OpenERP 7.0 web 模块关于 客户端浏览器事件处理的一些<br />设计. 仅供参考,望斧正...<br /><br />贴子不去分析 关于JS架构中 继承等技术. 只从应用程序切入点去分析.<br />首先是首页<br /><br />[code]<br />            $(function() {<br />                var s = new openerp.init(["web", "web_kanban", "web_diagram", "web_graph", "web_view_editor", "web_calendar", "base", "web_tests", "web_gantt"]);<br />                var wc = new s.web.WebClient();wc.appendTo($(document.body));<br />            });<br />[/code]<br /><br />var s = new openerp.init(....)  在 浏览器端做了 OpenERP 各模块的初始化载入工作.<br />var wc = new s.web.WebClient();  这里就开始了 WebClient 的实例.<br />我们重点就从 new 的这个 WebClient 入手.<br /><br />在 addons\web\static\static\src\js\chrome.js 代码中定义了 instance.web.WebClient<br />同样, 不去纠结这个 Class 应该如何写.<br />通常. 这类 Class 会以 init 实始化. start 方法开始.<br />所以, 暂不去纠结为什么... <br />直接看 WebClient.start() 的代码.<br /><br />[code]<br />....<br />            if (!self.session.session_is_valid()) {<br />                self.show_login();<br />            } else {<br />                self.show_application();<br />            }<br />....<br />[/code]<br /><br />重点在这里..<br />if 语句 判断了是否登陆.<br />未登陆就执行 show_login 的登陆部分.<br />否则就 show_application 显示整个客户端.<br /><br />show_login 部分, 咱们也暂时略过.<br /><br />show_application 部分<br /><br />[code]<br />....<br />    show_application: function() {<br />        var self = this;<br />        self.toggle_bars(true);<br />        self.update_logo();<br />        self.menu = new instance.web.Menu(self);<br />        self.menu.replace(this.$el.find('.oe_menu_placeholder'));<br />        self.menu.on('menu_click', this, this.on_menu_action);<br />        self.user_menu = new instance.web.UserMenu(self);<br />        self.user_menu.replace(this.$el.find('.oe_user_menu_placeholder'));<br />        self.user_menu.on('user_logout', self, self.on_logout);<br />        self.user_menu.do_update();<br />        self.bind_hashchange();<br />        self.set_title();<br />        self.check_timezone();<br />    },<br /><br />....<br />[/code]<br /><br />这部分代码 就初始化了菜单, 并显示了菜单. 显示完菜单的同时, bind_hashchange 中, 判断<br />菜单是否完整载入. 菜单载入后 <br /><br />[code]<br />....<br />            self.menu.has_been_loaded.done(function() {<br />                var first_menu_id = self.menu.$el.find("a:first").data("menu");<br />                if(first_menu_id) {<br />                    self.menu.menu_click(first_menu_id);<br />                }<br />            });<br />....<br />[/code]<br /><br />                var first_menu_id = self.menu.$el.find("a:first").data("menu");<br />取出了 第一个菜单项, 并模拟点击. self.menu.menu_click(first_menu_id);<br /><br />重点就是这个 menu.menu_click 里了<br /><br />web.Menu.menu_click 中, 前面部分 是对于非末级菜单的处理..<br /><br />[code]<br />....<br />        if (action_id) {<br />            this.trigger('menu_click', {<br />                action_id: action_id,<br />                needaction: needaction,<br />                id: id,<br />                previous_menu_id: this.current_menu // Here we don't know if action will fail (in which case we have to revert menu)<br />            }, $item);<br />        }<br />....<br />[/code]<br />如果该菜单项 上绑定了 action , 那么 就 this.trigger 一个 Menu 对象的 menu_click 事件.<br />重点就在这里.<br /> trigger 的 menu_click 事件 是如何被捕捉到的呢? 按 成都-gotham(30943392) 提示. 在 web.WebClient.show_application 事件中:<br /> self.menu.on('menu_click', this, this.on_menu_action); 这里为 menu 注册了 menu_click 事件的处理方法 即 web.WebClient.on_menu_action<br /><br /> 在客户端打断点, 并测试成功.<br /><br />由此猜测. 在OpenERP 7.0 Web Client 的开发中. 可以在JS客户端对象中抛出 事件. 并在其他对象中注册对各种事件的捕获处理事件即可.<br /><br />如本例: 要对 菜单的点击中 去关联一个点击的事件处理.<br />就在 Menu 对象中 注册 事件名. 并绑定一个 function 以及传递一个绑定该  function 的对象. 然后 其他地方只需要 trigger 该 对象的该方法即可<br />(当然还可以传递很多参数)<br /><br />



  • OpenERP Web Client 事件处理源码初探<br /><br />昨天(2013-09-22)在检查 sale.order  的 子表 sale.order.line product_id 中获取 context 传递丢失的问题时, <br />需要了解一下 OpenERP 7.0 Web 模块的Javascript 源码.<br />得群中 成都-gotham(30943392) 提示, 初略地了解了一下OpenERP 7.0 web 模块关于 客户端浏览器事件处理的一些<br />设计. 仅供参考,望斧正...<br /><br />贴子不去分析 关于JS架构中 继承等技术. 只从应用程序切入点去分析.<br />首先是首页<br /><br />[code]<br />            $(function() {<br />                var s = new openerp.init(["web", "web_kanban", "web_diagram", "web_graph", "web_view_editor", "web_calendar", "base", "web_tests", "web_gantt"]);<br />                var wc = new s.web.WebClient();wc.appendTo($(document.body));<br />            });<br />[/code]<br /><br />var s = new openerp.init(....)  在 浏览器端做了 OpenERP 各模块的初始化载入工作.<br />var wc = new s.web.WebClient();  这里就开始了 WebClient 的实例.<br />我们重点就从 new 的这个 WebClient 入手.<br /><br />在 addons\web\static\static\src\js\chrome.js 代码中定义了 instance.web.WebClient<br />同样, 不去纠结这个 Class 应该如何写.<br />通常. 这类 Class 会以 init 实始化. start 方法开始.<br />所以, 暂不去纠结为什么... <br />直接看 WebClient.start() 的代码.<br /><br />[code]<br />....<br />            if (!self.session.session_is_valid()) {<br />                self.show_login();<br />            } else {<br />                self.show_application();<br />            }<br />....<br />[/code]<br /><br />重点在这里..<br />if 语句 判断了是否登陆.<br />未登陆就执行 show_login 的登陆部分.<br />否则就 show_application 显示整个客户端.<br /><br />show_login 部分, 咱们也暂时略过.<br /><br />show_application 部分<br /><br />[code]<br />....<br />    show_application: function() {<br />        var self = this;<br />        self.toggle_bars(true);<br />        self.update_logo();<br />        self.menu = new instance.web.Menu(self);<br />        self.menu.replace(this.$el.find('.oe_menu_placeholder'));<br />        self.menu.on('menu_click', this, this.on_menu_action);<br />        self.user_menu = new instance.web.UserMenu(self);<br />        self.user_menu.replace(this.$el.find('.oe_user_menu_placeholder'));<br />        self.user_menu.on('user_logout', self, self.on_logout);<br />        self.user_menu.do_update();<br />        self.bind_hashchange();<br />        self.set_title();<br />        self.check_timezone();<br />    },<br /><br />....<br />[/code]<br /><br />这部分代码 就初始化了菜单, 并显示了菜单. 显示完菜单的同时, bind_hashchange 中, 判断<br />菜单是否完整载入. 菜单载入后 <br /><br />[code]<br />....<br />            self.menu.has_been_loaded.done(function() {<br />                var first_menu_id = self.menu.$el.find("a:first").data("menu");<br />                if(first_menu_id) {<br />                    self.menu.menu_click(first_menu_id);<br />                }<br />            });<br />....<br />[/code]<br /><br />                var first_menu_id = self.menu.$el.find("a:first").data("menu");<br />取出了 第一个菜单项, 并模拟点击. self.menu.menu_click(first_menu_id);<br /><br />重点就是这个 menu.menu_click 里了<br /><br />web.Menu.menu_click 中, 前面部分 是对于非末级菜单的处理..<br /><br />[code]<br />....<br />        if (action_id) {<br />            this.trigger('menu_click', {<br />                action_id: action_id,<br />                needaction: needaction,<br />                id: id,<br />                previous_menu_id: this.current_menu // Here we don't know if action will fail (in which case we have to revert menu)<br />            }, $item);<br />        }<br />....<br />[/code]<br />如果该菜单项 上绑定了 action , 那么 就 this.trigger 一个 Menu 对象的 menu_click 事件.<br />重点就在这里.<br /> trigger 的 menu_click 事件 是如何被捕捉到的呢? 按 成都-gotham(30943392) 提示. 在 web.WebClient.show_application 事件中:<br /> self.menu.on('menu_click', this, this.on_menu_action); 这里为 menu 注册了 menu_click 事件的处理方法 即 web.WebClient.on_menu_action<br /><br /> 在客户端打断点, 并测试成功.<br /><br />由此猜测. 在OpenERP 7.0 Web Client 的开发中. 可以在JS客户端对象中抛出 事件. 并在其他对象中注册对各种事件的捕获处理事件即可.<br /><br />如本例: 要对 菜单的点击中 去关联一个点击的事件处理.<br />就在 Menu 对象中 注册 事件名. 并绑定一个 function 以及传递一个绑定该  function 的对象. 然后 其他地方只需要 trigger 该 对象的该方法即可<br />(当然还可以传递很多参数)<br /><br />



  • 不明觉厉



  • 总监威武,回头自己断点测试一下!



  • 呵呵,也加入论坛了



  • 强帖留名



  • 好家伙,最近也在梳理 web 端逻辑,此文是 开端利器



  • “...context 传递丢失的问题...”,原来早有发现了



  • 这里面有几个问题:<br />[list type=decimal]<br />[li]同一个事件,能不能绑定多一个响应方法?后面的绑定会不会覆盖前面的绑定?[/li]<br />[li]如果可以同时绑定多个响应的话,这几个响应是并行还是串行?[/li]<br />[/list]<br /><br />下次我也要找个机会试一下。



  • [quote author=panyi5202 link=topic=12397.msg28644#msg28644 date=1406772278]<br />这里面有几个问题:<br />[list type=decimal]<br />[li]同一个事件,能不能绑定多一个响应方法?后面的绑定会不会覆盖前面的绑定?[/li]<br />[li]如果可以同时绑定多个响应的话,这几个响应是并行还是串行?[/li]<br />[/list]<br /><br />下次我也要找个机会试一下。<br />[/quote]<br /><br />按OE 惯例. 应该是会都调用. 按 JS 的惯例 应该是并行....



  • 正在学习oe,准备实施,翻个老帖。<br />可以绑定多个响应方法,不会覆盖。<br />JS不是多线程的,所以始终是串行,但是串行的顺序并不一定严格按照绑定顺序。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待