Odoo Widget 开发教程(二)

时间:2022-09-28 12:23:22

Odoo JavaScript 模块

在Odoo框架中,是在组件(addons)中定义Javascript模块,以此避免名字空间的冲突和规范加载顺序。
oepetstore/static/js/petstore.js 包含了一个模块定义:

openerp.oepetstore = function(instance, local) {
local.xxx = ...;
}

在Odoo中,模块以全局变量openerp 的形式定义。函数名必须和模块名一致。 (在示例中为 oepetstore),框架才能找到并自动初始化。
当Odoo加载模块时,将传递两个变量:

  • 第一个变量是当前的Web Client实例。通过它可以访问Odoo定义的很多变量,如翻译、网络服务和其它模块定义的对象。
  • 第二个参数是由web client自动生成的本地名字空间。需要供其它模块访问的对象和变量定义在此名字空间中。

Javascript的类通过调用openerp.web.Class()的excend()方法定义。

var MyClass = instance.web.Class.extend({
say_hello: function() {
console.log("hello");
},
});

Extend()方法使用字典来描述类的方法和静态属性。在这个示例中,它有一个无参数的say_hello 方法。
类的实体通过new操作符生成。

var my_object = new MyClass();
my_object.say_hello();
// print "hello" in the console

可以通过this来访问实体的属性。

var MyClass = instance.web.Class.extend({
say_hello: function() {
console.log("hello", this.name);
},
});

var my_object = new MyClass();
my_object.name = "Bob";
my_object.say_hello();
// print "hello Bob" in the console

类可以通过定义init方法来对实体进行初始化。

var MyClass = instance.web.Class.extend({
init: function(name) {
this.name = name;
},
say_hello: function() {
console.log("hello", this.name);
},
});

var my_object = new MyClass("Bob");
my_object.say_hello();
// print "hello Bob" in the console

可以通过 extend()定义子类

var MySpanishClass = MyClass.extend({
say_hello: function() {
console.log("hola", this.name);
},
});

var my_object = new MySpanishClass("Bob");
my_object.say_hello();
// print "hola Bob" in the console

当重载父类方法时,可以通过 this._super() 来调用父类的方法。

var MySpanishClass = MyClass.extend({
say_hello: function() {
this._super();
console.log("translation in Spanish: hola", this.name);
},
});

var my_object = new MySpanishClass("Bob");
my_object.say_hello();
// print "hello Bob \n translation in Spanish: hola Bob" in the console