From f7ac2c7b72ac721c7f01a885bd81fef3ea452085 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Fri, 26 Apr 2019 22:18:21 +0200 Subject: [PATCH] Improved `addType` in Components module --- src/dom_components/index.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/dom_components/index.js b/src/dom_components/index.js index 7f0ff50b2..a2bb3bdce 100644 --- a/src/dom_components/index.js +++ b/src/dom_components/index.js @@ -528,7 +528,9 @@ module.exports = () => { view = {}, isComponent, extend, - extendView + extendView, + extendFn = [], + extendFnView = [] } = methods; const compType = this.getType(type); const extendType = this.getType(extend); @@ -543,11 +545,26 @@ module.exports = () => { ? extendViewType.view : typeToExtend.view; + // Function for extending source object methods + const getExtendedObj = (fns, target, srcToExt) => + fns.reduce((res, next) => { + const fn = target[next]; + const parentFn = srcToExt.prototype[next]; + if (fn && parentFn) { + res[next] = function(...args) { + parentFn.bind(this)(...args); + fn.bind(this)(...args); + }; + } + return res; + }, {}); + // If the model/view is a simple object I need to extend it if (typeof model === 'object') { methods.model = modelToExt.extend( { ...model, + ...getExtendedObj(extendFn, model, modelToExt), defaults: { ...modelToExt.prototype.defaults, ...(result(model, 'defaults') || {}) @@ -563,7 +580,10 @@ module.exports = () => { } if (typeof view === 'object') { - methods.view = viewToExt.extend({ ...view }); + methods.view = viewToExt.extend({ + ...view, + ...getExtendedObj(extendFnView, view, viewToExt) + }); } if (compType) {