大家好,
本文主要對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 各種函數的關聯關係。
謝謝!