检查AngularJS指令&变量在表达式中设置

时间:2014-03-21 13:29:34

标签: angularjs

这是以下问题的扩展

How do you check if & variable is set in directive

是否可以检查指令HTML中的表达式中是否已设置变量?

<button class="btn btn-primary navbar-btn" ng-click="callback()" 
    ng-show="isFunction(callback)"></button>

在上面的示例中,ng-show评估为null,因为angular.isFunction并不存在于表达式中。

我尝试在范围上定义一个局部函数但总是返回true,因为 回调始终定义为函数:

$scope.callback():function (locals) {
    return parentGet(scope, locals);
}

1 个答案:

答案 0 :(得分:0)

我意识到OP现在可能已经找到了答案,但我今天遇到了同样的问题,这是唯一一个关注此问题的问题。

最简单的解决方案是检查是否在元素上定义了属性:

angular.isDefined(attrs['anAttribute'])

这只检查属性的存在,而不评估表达式。

问题是angular会使用getter包装&函数(结果代码在原始问题中),这会阻止我们使用angular.isFunctionangular.isDefined。这就是它的作用(角度1.3.14):

[...]
case '&':
  parentGet = $parse(attrs[attrName]);
  isolateBindingContext[scopeName] = function(locals) {
    return parentGet(scope, locals);
  };
  break;

但是,如果我们以这种方式传递回调:

<button class="btn btn-primary navbar-btn" ng-click="callback" 
   ng-show="isFunction(callback)"></button>

然后,在指令链接功能中我们可以做到:

scope.callback = scope.callback();
angular.isDefined(scope.callback) // actually works as expected

这种方法的缺点是我们失去了指令api的一些声明性。