我在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() {
//
// }
// }
})();
它将被用作接收operation
或project
值以及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
个数字。
答案 0 :(得分:2)
当你的指令的链接函数开始执行时,vm.project在那时是未定义的。在$ scope.project上设置监视。
内部指令:
$scope.$watch('project', function (newValue, oldValue) {
if (newValue) {
// do stuff
}
});