diff options
Diffstat (limited to 'addons/web/static/src/js/framework/widget.js')
| -rw-r--r-- | addons/web/static/src/js/framework/widget.js | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/addons/web/static/src/js/framework/widget.js b/addons/web/static/src/js/framework/widget.js index ad68f4e9410..f606e8482ca 100644 --- a/addons/web/static/src/js/framework/widget.js +++ b/addons/web/static/src/js/framework/widget.js @@ -64,6 +64,7 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, { className: null, attributes: {}, events: {}, + custom_events: {}, /** * The name of the QWeb template that will be used for rendering. Must be * redefined in subclasses or the default render() method can not be used. @@ -94,6 +95,7 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, { } // FIXME: this should not be this.setElement(this._make_descriptive()); + this.delegateCustomEvents(); }, /** * Method called between init and start. Performs asynchronous calls required by start. @@ -303,6 +305,21 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, { } } }, + delegateCustomEvents: function () { + if (_.isEmpty(this.custom_events)) { return; } + for (var key in this.custom_events) { + if (!this.custom_events.hasOwnProperty(key)) { continue; } + + var method = this.proxy(this.custom_events[key]); + this.on(key, this, wrap_handler(method)); + } + function wrap_handler(callback) { + return function (event) { + event.stop_propagation(); + callback(event); + }; + } + }, undelegateEvents: function () { this.$el.off('.widget_events'); }, |
