odoo 的 javascript 架构

大家好,

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

谢谢!

  • 45
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值