了解AngularJS指令方法绑定是否默认为angular.noop

Know if AngularJS directive method binding defaults to angular.noop

本文关键字:默认 angular noop 是否 绑定 AngularJS 指令 方法 了解      更新时间:2023-09-26

我有一个简单的指令,传递一个函数到一个插件;然后,插件将使用给定值的函数。为简单起见,让我们忽略对数据的更改:

angular.module('some.directives', [])
  .directive('myDirective', [,
    function () {
      return {
        restrict: 'EAC',
        scope: {
          value: '@', // some value
          fun: '&' // the function
        },
        link: function(scope, element, attrs) {
          ThePlugin.thisIsTheVal(scope.value);
          ThePlugin.thisIsTheFun(scope.fun);
        }
      };
    }
  ]);

问题是:当fun属性没有定义或父作用域没有指定的函数时,ThePlugin将始终执行angular.noop,因为这似乎是默认的AngularJS提供。

因为我需要传递一个真正的undefined时,函数没有定义,我怎么能知道如果调用范围实际上有函数?

一种解决方法可能是根据目标值测试函数,如果结果值是undefined本身,则返回undefined:

ThePlugin.thisIsTheFun(function() {
  if (scope.fun(scope.value) === undefined) {
    return scope.fun;
  }
  return undefined;
});

这可能会导致一些不一致,因为将来可能允许fun函数返回undefined作为正确的结果。

检查是否定义了fun属性:

if (!attrs.hasOwnProperty('fun')) {
   scope.fun = undefined;
}