Я хочу создать директиву, которая проверяет, должен ли элемент присутствовать в dom на основе значения, полученного от службы (например, проверить роль пользователя).
Соответствующая директива выглядит следующим образом:
angular.module('app', []).directive('addCondition', function($rootScope) {
return {
restrict: 'A',
compile: function (element, attr) {
var ngIf = attr.ngIf,
value = $rootScope.$eval(attr.addCondition);
/**
* Make sure to combine with existing ngIf!
* I want to modify the expression to be evalued by ngIf here based on a role
* check for example
*/
if (ngIf) {
value += ' && ' + ngIf;
}
attr.$set('ng-if', value);
}
};
});
В конце элемент имеет прикрепленный атрибут ng-if, но каким-то образом он не применяется к элементу и он все еще существует в dom. Таким образом, это, очевидно, неправильный подход.
Эта скрипта показывает проблему: http://jsfiddle.net/L37tZ/2/
Кто может объяснить, почему это происходит? Есть ли другой способ аналогичного поведения? Существующие ngIfs следует учитывать.
РЕШЕНИЕ:
Использование: <div rln-require-roles="['ADMIN', 'USER']">I'm hidden when theses role requirements are not satifisfied!</div>
.directive('rlnRequireRoles', function ($animate, Session) {
return {
transclude: 'element',
priority: 600,
terminal: true,
restrict: 'A',
link: function ($scope, $element, $attr, ctrl, $transclude) {
var block, childScope, roles;
$attr.$observe('rlnRequireRoles', function (value) {
roles = $scope.$eval(value);
if (Session.hasRoles(roles)) {
if (!childScope) {
childScope = $scope.$new();
$transclude(childScope, function (clone) {
block = {
startNode: clone[0],
endNode: clone[clone.length++] = document.createComment(' end rlnRequireRoles: ' + $attr.rlnRequireRoles + ' ')
};
$animate.enter(clone, $element.parent(), $element);
});
}
} else {
if (childScope) {
childScope.$destroy();
childScope = null;
}
if (block) {
$animate.leave(getBlockElements(block));
block = null;
}
}
});
}
};
});
Очень важно добавить приоритет в директиве, иначе другие директивы, прикрепленные к этому элементу, не будут оценены!