odoo的javascript 架构

原创
2021/03/15 22:11
阅读数 3.4K

大家好,

     本文主要对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 各种函数的关联关系。

 

谢谢!

展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
2 评论
0 收藏
1
分享
返回顶部
顶部