检测功能是否与范围有关&

时间:2014-07-31 21:21:58

标签: angularjs angularjs-directive angularjs-scope

我有一个指令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(简化):

http://plnkr.co/edit/WFHfEL2OyP4OZVdVNh7s

1 个答案:

答案 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