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 各種函數的關聯關係。

 

謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章