angular 自定义指令中的值未定义

Value undefined in angular custom directive

我试图制定一个指令,如果用户没有看到它的权限,就销毁 DOM 元素。我这样做如下:

angular
        .module('digital_equation.auth')
        .controller('AuthLoginController', AuthLoginController)
        .directive('ngPermission', ngPermissionDirective);

function ngPermissionDirective() {
    return {
        multiElement: true,
        scope: {
            ngPermission: '@'
        },
        restrict: 'A',
        link: function (scope, element, attributes) {
            scope.$watch('ngPermission', function (value) {
                console.log(value);
                //Access rootScope to get the current user permissions
                var permissions = scope.$root.globals.currentUser.role.settings.permissions;
                //Loop through permissions object to check if any permission is the same as the value sent to directive
                var keepGoing = true;
                angular.forEach(permissions, function (permission, key) {
                    if (keepGoing == true)
                    {
                        if (key == value) {
                            element.show();
                            keepGoing = false;
                        }
                        else {
                            element.hide();
                        }
                    }
                });
            })
        }
    };
}

HTML:

<div class="col-xs-12 col-md-9" ng-permission="manage_appointments"></div>

在这种情况下,例如,如果从 rootScope 获取的当前用户没有 "manage_appointments" 权限,那么这个 div 应该被销毁。如您所见,我只知道如何隐藏它,但这还不够,我需要将其销毁,因此在页面检查中,此 div 不会显示。 我的第二个问题是 console.log(value); returns undefined 不管我尝试了什么。 我还需要有关访问 rootScope 的建议。如果我在这里将 rootScope 作为参数传递,它可以工作,但我也不能传递范围。所以我该怎么做。

link: function(rootScope, element, attributes )

请记住,即使我在 authController 中声明了我的指令,我也需要它在我的整个项目中可用。 抱歉描述不当,但这是我在 AngularJs 中的第一个自定义指令,我尝试了很多选项。 感谢大家的宝贵时间和帮助!

编辑:

scope.$watch('ngPermission', function (value)

这解决了我的值未定义的问题,但是当我尝试在两个不同的元素(一个要隐藏,一个要显示)上使用该指令时,它将执行我的指令的最后一次使用(显示在这种情况下都是)。知道为什么会这样吗?

解决方案:

function ngPermissionDirective() {
    return {
        multiElement: true,
        priority: 900,
        scope: {
            ngPermission: '@'
        },
        restrict: 'A',
        link: function (scope, element, attributes) {
            scope.$watch('ngPermission', function (value) {
                console.log(value);
                //Access rootScope to get the current user permissions
                var permissions = scope.$root.globals.currentUser.role.settings.permissions;
                //Loop through permissions object to check if any permission is the same as the value sent to directive
                var keepGoing = true;
                angular.forEach(permissions, function (permission, key) {
                    if (keepGoing == true)
                    {
                        if (key == value) {
                            element.show();
                            keepGoing = false;
                        }
                        else {
                            element.remove();
                        }
                    }
                });
            })
        }
    };
}

尝试将 scope.$watch(attributes.ngPermission, ... 更改为 scope.$watch('ngPermission', ...

另一种方法可能是 $observe - attributes.$observe('ngPermission', ...