Mendix—dojo.aspect模块你必须知道的

  • 2020 年 2 月 25 日
  • 筆記

dojo/aspect 模块的官方地址:  https://dojotoolkit.org/reference-guide/1.10/dojo/aspect.html#dojo-aspect

在mendix开发中难免会遇到一些需求是使用现有组件无法实现的,那么我们需要在已有的基础组件/功能上附加一些新的功能。此时一个很关键模块我们就需要使用到。

一、dojo/aspect介绍

dojo/aspect提供了面向切面编程的能力。我们可以利用他在已有的函数前,后执行自己的函数,或者阻止执行已有的函数。 dojo/aspect提供了after,before,around三个函数,三个函数的作用将在后续介绍。

1、after(target, methodName, advisingFunction, receiveArguments);函数

参数介绍:  1、target:目标对象;  2、methodName:目标对象的函数;  3、advisingFunction:自定义函数;  4、receiveArguments:advisingFunction函数  是否使用methodName函数的参数。

简单说明: receiveArguments为boolean值,如果为true,则advisingFunction函数的入参为methodName的参数。 此函数作用:在目标函数执行之后执行自定义函数;advisingFunction的返回值将作为调用methodName的返回值,即after具有修改目标函数的能力。

一个例子:

define(["dojo/aspect"], function(aspect){    aspect.after(dojo, "xhr", function(deferred){      // 将会在 dojo.xhr 之后执行    });    // 执行dojo原生的函数    dojo.xhr("GET", {...});  });

2、before(target, methodName, advisingFunction)

参数介绍:  1、target:目标对象;  2、methodName:目标对象的函数;  3、advisingFunction:自定义函数    简单说明:  1、advisingFunction函数法接收的参数为methodName函数的参数;  2、advisingFunction方法可以有一个返回值,  该返回值将替换掉调用methodName(或者下一个before)时的参数,  即before有改methodName参数的能力。  3、advisingFunction的返回值需要是一个数组。

此函数的作用: 顾名思义,其主要作用是在目标函数执行之前执行自定义函数, 可以达到修改目标函数参数的作用。

一个例子:

define(["dojo/aspect"], function(aspect){    aspect.before(dojo, "xhr", function(method, args){//此参数为xhr的参数      //在xhr函数执行之前执行      if(method == "PUT"){        // 测试:修改一下入参        args.url += "?x-method=PUT";        // 返回新的参数将作为xhr的入参        return ["POST", args];      }    });    // 在上述函数执行之后执行    dojo.xhr("PUT", {...});  });

3、around(target, methodName, advisingFactory);

参数说明:  1、target:目标对象;  2、methodName:目标函数  3、advisingFactory:methodName方法执行前执行的方法    简单说明:  1、advisingFactory接收的参数为目标函数methodName。  2、advisingFactory必须返回一个函数,且函数参数为  目标函数methodName的参数;  3、advisingFactory返回的函数中可以对参数重新处理,  之后选择性的调用或者不调用目标methodName,  如果调用也可以处理methodName的返回值。  4、advisingFactory返回的函数的返回值作为  最开始调用methodName的返回值。

此函数的作用:around即可以修改methodName的参数又可以修改methodName返回的结果,且methodName不一定执行

一个例子:

define(["dojo/aspect"], function(aspect){    aspect.around(dojo, "xhr", function(originalXhr){    //around()在xhr函数执行之前执行,且入参为xhr函数    //必须有一个返回函数,且入参为xhr函数的入参      return function(method, args){        // 可以做一些原始函数调用之前得操作          //选择性调用原始函数xhr        var deferred = originalXhr(method, args);          //自己的业务逻辑.....          //此返回值将会作为xhr函数的返回值        return deferred;      }    });    dojo.xhr("PUT", {...});  });

参考:https://blog.csdn.net/lj15875569485/article/details/35573291

https://dojotoolkit.org/reference-guide/1.10/dojo/aspect.html#dojo-aspect