vuvivian's blog

越努力,越幸运.

  1. 1. 事件系统
  2. 2. 基础事件系统
  3. 3. 扩展的事件系统

事件系统

目前,odoo支持两个事件系统:一个允许添加侦听器和触发事件的简单系统,以及一个更完整的系统,它还可以使事件“冒泡”。

这两个事件系统都在文件mixins.js的eventspatchemixin中实现。这个mixin包含在widget类中。

基础事件系统

这是历史上第一个事件系统。它实现了一个简单的总线模式。我们有4种主要方法:

  • on : 在一个事件上注册监听器
  • off: 移除事件的监听器
  • once: 注册一个只使用一次的监听器
  • trigger:跟踪一个事件。这会调用所有监听器。
    一下是一个怎么使用事件系统的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var Widget = require('web.Widget');
var Counter = require('myModule.Counter');

var MyWidget = Widget.extend({
start: function () {
this.counter = new Counter(this);
this.counter.on('valuechange', this, this._onValueChange);
var def = this.counter.appendTo(this.$el);
return $.when(def, this._super.apply(this, arguments);
},
_onValueChange: function (val) {
// do something with val
},
});

// in Counter widget, we need to call the trigger method:

... this.trigger('valuechange', someValue);

警告
不鼓励使用此事件系统,我们计划用扩展事件系统中的trigger-up方法替换每个trigger方法。

扩展的事件系统

自定义事件小部件是一个更高级的系统,它模拟DOM事件API。每当一个事件被触发时,它将“冒泡”组件树,直到它到达根小部件,或者停止。

  • trigger_up:这是一种方法,它将创建一个小的odooEvent并将其分派到组件树中。请注意,它将从触发事件的组件开始
  • custom_events:这相当于事件字典,但是对于odoo事件来说。
    OdoEvent类非常简单。它有三个公共属性:target(触发事件的小部件)、name(事件名称)和data(有效负载)。它还有两种方法:stopPropagation 和 is_stopped.。
    上一个示例可以更新为使用自定义事件系统:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var Widget = require('web.Widget');
var Counter = require('myModule.Counter');

var MyWidget = Widget.extend({
custom_events: {
valuechange: '_onValueChange'
},
start: function () {
this.counter = new Counter(this);
var def = this.counter.appendTo(this.$el);
return $.when(def, this._super.apply(this, arguments);
},
_onValueChange: function(event) {
// do something with event.data.val
},
});

// in Counter widget, we need to call the trigger_up method:

... this.trigger_up('valuechange', {value: someValue});
本文最后更新于 天前,文中所描述的信息可能已发生改变