2014-10-29 24 views
2

存在功能我有以下范围的指令:AngularJS检查,如果在指令

scope: { 
    copyObject: '&', 
    deleteObject: '&' 
} 

现在,我已经在我的模板相应的按钮,看起来像这样:

<button ng-click="copyObject()">Copy</button> 

然而,如果没有将功能应用于copy-object,我想隐藏该按钮,例如:

<!-- Should show the copy button --> 
<my-directive copy-object="copyObject()"></my-directive> 

<!-- Should not show the copy button --> 
<my-directive></my-directive> 

所以我申请以下到我的模板:

<button ng-click="copyObject()" ng-if="copyObject">Copy</button> 

但是,这似乎并没有工作,如果我检查真正的隔离范围的指令,我注意到,即使不输入的属性,功能仍然存在,所以按钮始终可见。

是否可以检测功能是否绑定到copyObject()?这是一个很好的做法吗?我不确定指令是否应该知道绑定函数,或者是否存在某种范围访问冲突?

示例:http://jsfiddle.net/azchpo5q/(第二个按钮不应该是可见的,因为没有绑定的动作)。

+0

的点击是没有问题的(即已经与支架作品),但我想隐藏按钮,如果没有函数被绑定到它。我添加了一个小提琴:http://jsfiddle.net/azchpo5q/第二个按钮不应该是可见的,因为它没有'copy-object'属性。 – g00glen00b 2014-10-29 10:53:50

+1

我找到了答案:http://stackoverflow.com/questions/21935099/how-to-check-if-a-method-argument-of-a-directive-is-specified-in-angularjs(我也投票给关闭作为副本) – g00glen00b 2014-10-29 11:03:17

+0

Thx g00glen00b,你的答案解决了我的问题! – SathOkh 2016-11-08 11:25:30

回答

2

您可以使用ng-if中的函数来确定函数是否已定义。

<button ng-click="copyObject()" ng-if="doShowCopy()">Copy</button> 

然后定义这个方法:

$scope.doShowCopy = function() { 
    return (typeof $scope.copyObject == 'function'); 
} 
+3

问题是'typeof $ scope.copyObject'是** always **函数,因为这是一个包装函数,它不是来自外部作用域的直接函数。 – dfsq 2014-10-29 10:59:35

+0

好吗?我猜它可能是在范围内定义的,但不是一个函数! – Prasad 2014-10-29 11:01:10

+0

它被定义为一个函数是的,如果我使用'directive.isolateScope()。copyObject'它会返回一个函数。我通过使用'link()'函数中的'attrs'解决了另一个问题。我将其标记为重复。 – g00glen00b 2014-10-29 11:02:22