角度指令" =" value绑定到范围,但未定义?

时间:2016-01-22 11:38:58

标签: javascript angularjs angularjs-directive

我在Angular应用程序中定义了以下指令:

(function() {
    'use strict';

    angular
    .module('almonds')
    .directive('security', ['$animate', 'AuthFactory', directive]);

    function directive($animate, AuthFactory) {
        var directive = {
            restrict: 'EA',
            scope: {
                operation: "@",
                clearance: "@",
                project: "="
            },
            link: linkFunc
        };

        return directive;

        function linkFunc($scope, $element, $attr, ctrl, $transclude) {
            var block, childScope, previousElements;

            console.log($scope.project);

            if($scope.project) {
                var projectId = $scope.project.id;
            }

            var operation = $scope.operation;
            var clearance = $scope.clearance;


            if (projectId) {
                var value = AuthFactory.hasProjectAccess(projectId, clearance);
                console.log('PROJECT SECURITY:', projectId, clearance, value);
            } else {
                var value = AuthFactory.hasAccess(operation, clearance);
                console.log('ORG SECURITY:', operation, clearance, value);
            }
        }
    }
// Controller.$inject = ['$scope'];
//
// function Controller($scope) {
//     var vm = this;
//
//     activate();
//
//     function activate() {
//
//     }
// }
})();

它将被用作接收operationproject值以及clearance值的元素,然后将使用该值,无论所述元素是否将呈现(I省略了该部分,但它的功能与ng-if)基本相同。

以下是其使用示例:

<span security project="vm.project" clearance="admin">
    <a role="button" ng-click="vm.confirmDeletion();"><span class="melon-icon-md melon-icon-trash"></span></a>
</span>

虽然发生了什么,但即使vm.project确实定义了,console.log($scope.project);也会产生undefined。有趣的是,如果我只是console.log($scope);包含project属性,其中包含我需要的信息。我做错了什么?

我实际上只需要项目的id值,所以我可以传入整个project对象并访问指令中的id,或以某种方式通过仅id个数字。

1 个答案:

答案 0 :(得分:2)

当你的指令的链接函数开始执行时,vm.project在那时是未定义的。在$ scope.project上设置监视。

内部指令:

$scope.$watch('project', function (newValue, oldValue) {
    if (newValue) {
        // do stuff
    }
});