AngularJS指令中的可选表达式属性

boy*_*son 13 javascript angularjs angularjs-directive

我有一个自定义导航指令需要一个可选的"禁用"属性,我不确定它是否可能.

在我的主控制器中:

.controller('NavCtrl', ['UserResource','RoleResource'], function(UserResource,RoleResource){
      var user = UserResource.getUser();
      var roles = RoleResource.getRoles();
      UserService.init(user, roles); //????

});
Run Code Online (Sandbox Code Playgroud)

在我的指令中:

.directive('navItem', function(){
    return{
        restrict: 'A',
        scope: {
            text: '@',
            href: '@',
            id: '@',
            disable: '&'

        },
        controller: function($scope, $element, $attrs){
            $scope.disabled = ''; //Not sure I even need a controller here
        },
        replace: true,
        link: function(scope, element, attrs){
            scope.$eval(attrs.disable);
        },
        template: '<li class="{{disabled}}"><a href="{{href}}" id="{{id}}">{{text}}</a></li>'

    }

});
Run Code Online (Sandbox Code Playgroud)

在我的HTML中,我想做这样的事情:

<div data-nav-item text="My Text" href="/mytemplate.html" id="idx"
     disable="UserService.hasRole('ADMIN,BILLING') && someOtherFn(xxx) || ...">
Run Code Online (Sandbox Code Playgroud)

Mar*_*cok 8

你可以通过chaning $ eval来调用你的工作

scope.$parent.$eval(attrs.disable);
Run Code Online (Sandbox Code Playgroud)

因为您需要评估attrs.disable父范围中包含的表达式,而不是指令的隔离范围.但是,由于您使用的是'&'语法,它将自动评估父作用域中的表达式.所以,请执行以下操作:

if(angular.isDefined(attrs.disable)) {
    scope.disable();
}
Run Code Online (Sandbox Code Playgroud)

小提琴.