我有一个指令popup
,它有一个隔离的范围,其中只有一个函数绑定:
模板
<popup>
<div class="confirm-button" ng-show="showConfirmButton" ng-click="onConfirm()">confirm</div>
</popup>
指令和控制器
angular.module('app.directives').directive('popup', [function () {
"use strict";
return {
restrict: "E",
scope: {
onConfirm: "&"
},
controller: 'popup-ctrl',
templateUrl: "partials/directives/popup.html"
};
}]);
angular.module('app.controllers').controller('popup-ctrl', [function ($scope) {
"use strict";
$scope.showConfirmButton = typeof $scope.onConfirm === 'function'; // ALWAYS TRUE :(
//...
}]);
用法
<popup onConfirm="doSomething()"></popup>
我想要做的很简单:如果没有任何功能限制在&amp; onConfirm,我想隐藏确认按钮。
这不起作用,因为typeof $scope.onConfirm === 'function';
始终为真。如果我在运行时检查我的作用域,我看到$scope.onConfirm.toString()
评估为 - 是否绑定该函数:
"function (locals) {
return parentGet(scope, locals);
}"
任何人都知道如何检测某些功能是否已绑定到&amp; onConfirm?
修改
这是一个Plunkr(简化):
答案 0 :(得分:1)
您可以向指令添加链接功能,并检查属性值以查看是否分配了任何内容: -
link:function(scope,elm, attr){
scope.showConfirmButton = !!attr.onConfirm;
},
另请注意,由于您的隔离范围已将属性定义为onConfirm
,因此您需要将其用作on-confirm
。即
<popup on-confirm="doSomething()"></popup>
<强> Plnkr 强>
无法查找与“&amp;”绑定到隔离范围绑定的函数引用据我所知,因为他们在内部进行了评估,直到范围链。
或者作为黑客你可以查看父范围:
.directive('popup', ['$parse',function ($parse) {
"use strict";
return {
restrict: "E",
scope: {
onConfirm: "&"
},
controller: 'popup-ctrl',
link:function(scope,elm, attr){
var elm = $parse(attr.onConfirm)(scope.$parent);
scope.showConfirmButton = !!attr.onConfirm && hasFunction(attr.onConfirm);
function hasFunction(func) {
return angular.isFunction($parse(func.substring(0, func.indexOf('(')))(scope.$parent));
}
},
template: '<div class="confirm-button" ng-show="showConfirmButton" ng-click="onConfirm()">confirm</div>'
};
<强> Plnkr 强>