大家好,
本文主要对 ODOO 的 JavaScript 架构进行讲解:
首先, odoo.define
函数是干什么的?
答:在 odoo 中,通过使用 odoo.define ('js_module_name', ...) 来声明一个模块,然后,其他模块可以通过 require ('js_module_name') 来调用这个模块。
例如:
odoo.define('js_模块_名称', function (require) { "use strict"; var A = require('js_模块_名称_A'); var B = require('js_模块_名称_B'); require('js_模块_名称_C'); // 一些代码 return 某些东西; });
说得更加详细一点,如下:
// 在文件a.js中 odoo.define('module.A', function (require) { "use strict"; var A = ...; return A; }); // 在文件b.js中 odoo.define('module.B', function (require) { "use strict"; var A = require('module.A'); var B = ...; // 某些引入 A 的逻辑 return B; });
从上面,我们可以看到 odoo.define 方法拥有三个输入:
-
moduleName: (模块名称)javascript 模块的名称。它应该是唯一的字符串。公约是有一个特定的描述后面的 odoo 插件的名称。例如,‘web.Widget’ 描述在 web addon 中定义的模块 , 输出一个 Widget class 。
- dependencies: 这个不是必要.
- 最后,最后一个参数是定义模块的函数。它的返回值是模块的值,可以传递给需要它的其他模块。
Class System 类系统
odoo 使用自己的 class 体系。基类位于 web. 类,在文件中 class.js. 如何创建类?主要机制是使用扩展方法(这相当于 ES6 类中的扩展)。
var Class = require('web.Class'); var Animal = Class.extend({ init: function () { this.x = 0; this.hunger = 0; }, move: function () { this.x = this.x + 1; this.hunger = this.hunger + 1; }, eat: function () { this.hunger = 0; }, });
在本例中,init 函数是构造函数。创建实例时将调用它。使用 new 关键字创建实例。
继承
继承现有类很方便。这只不过是通过在 _super 上使用 extend 方法来完成的。当调用方法时,框架将秘密地将一个特殊方法重新绑定到当前调用的方法。这允许我们使用这个 this._super ,每当我们需要调用父方法时。
var Animal = require('web.Animal'); var Dog = Animal.extend({ move: function () { this.bark(); this._super.apply(this, arguments); }, bark: function () { console.log('woof'); }, }); var dog = new Dog(); dog.move()
注意:这里一定不要忘记 this._super.apply(this, arguments); 这是 javascript 里,是将函数的属性与方法进行拷贝,主要是实现类的继承。
function Person(name){
this.name=name;
this.sayname=function (){
alert(this.name);
}
}
function Student(name){
Person.apply(this,arguments);
}
var xiaoming=new Student("小明");
xiaoming.sayname();
这样 Student 类拷贝了 Person 的属性和方法,实现了类的继承。
Mixins 类
odoo 类系统不支持多重继承,但是对于那些需要共享某些行为的情况,我们有一个 mixin 系统:extend 方法实际上可以接受任意数量的参数,并将它们组合到新类中。
var Animal = require('web.Animal'); var DanceMixin = { dance: function () { console.log('dancing...'); }, }; var Hamster = Animal.extend(DanceMixin, { sleep: function () { console.log('sleeping'); }, });
修补现有类
有时需要修改另一个类。目标是有一个机制来更改一个类和所有未来 / 现在的实例。这是通过使用 include 方法完成的:
var Hamster = require('web.Hamster'); Hamster.include({ sleep: function () { this._super.apply(this, arguments); console.log('zzzz'); }, });
综合上面所讲的
在代码目录中,在定义 web.Apps 这个模块时,引用了 AbstractAction 以及 config、core、framework、session ,并使用了他们。/addons/web/static/src/js/main.js,/addons/web/static/src/js/apps.js ,/addons/web/static/src/js/model.js
好了,大家应该都基本掌握的 odoo javascript 架构的基础概念,下次,会讲解 odoo javascript 各种函数的关联关系。
谢谢!