gpt4 book ai didi

angularjs - 有条件地将 Angular 指令属性添加到元素

转载 作者:行者123 更新时间:2023-12-03 13:00:39 25 4
gpt4 key购买 nike

是否有简单直接的方法来执行以下操作-

<div class="my-class" my-custom-directive="{{evaluate expression}}"></div>


这样,除非表达式的计算结果为true,否则angular不会添加指令?

编辑:

该指令必须是一个属性,所以请不要使用类似的解决方案
ng-ifrestrict: 'E'
ng-classrestrict: 'C'ng-attr-不适用于自定义指令。

最佳答案

为此,可以创建一个具有高优先级和terminal: true的指令。然后,您可以摆弄元素属性(添加或删除它们),然后重新编译元素以使指令运行。

这是一个小例子:http://plnkr.co/edit/DemVGr?p=info

更改“ directive-if”属性中的表达式以保留/删除“ logger”指令。

如果属性的表达式计算为false,则它将被删除。

<div directive-if="{'logger': 'myValue == 1'}"
logger="testValue">
<p>"logger" directive exists? <strong>{{logger}}</strong></p>
</div>


这是指令实现。

通过一些细微的调整,您可以将其交换以添加指令,而不是将其删除(如果您希望这样做)。

/**
* The "directiveIf" directive allows other directives
* to be dynamically removed from this element.
*
* Any number of directives can be controlled with the object
* passed in the "directive-if" attribute on this element:
*
* {'attributeName': 'expression'[, 'attribute': 'expression']}
*
* If `expression` evaluates to `false` then `attributeName`
* will be removed from this element.
*
* Usage:
*
* <any directive-if="{'myDirective': 'expression'}"
* my-directive>
* </any>
*
*/
directive('directiveIf', ['$compile', function($compile) {

// Error handling.
var compileGuard = 0;
// End of error handling.

return {

// Set a high priority so we run before other directives.
priority: 100,
// Set terminal to true to stop other directives from running.
terminal: true,

compile: function() {
return {
pre: function(scope, element, attr) {

// Error handling.
//
// Make sure we don't go into an infinite
// compile loop if something goes wrong.
compileGuard++;
if (compileGuard >= 10) {
console.log('directiveIf: infinite compile loop!');
return;
}
// End of error handling.


// Get the set of directives to apply.
var directives = scope.$eval(attr.directiveIf);
angular.forEach(directives, function(expr, directive) {
// Evaluate each directive expression and remove
// the directive attribute if the expression evaluates
// to `false`.
var result = scope.$eval(expr);
if (result === false) {
// Set the attribute to `null` to remove the attribute.
//
// See: https://docs.angularjs.org/api/ng/type/$compile.directive.Attributes#$set
attr.$set('logger', null)
}
});


// Remove our own directive before compiling
// to avoid infinite compile loops.
attr.$set('directiveIf', null);

// Recompile the element so the remaining directives
// can be invoked.
var result = $compile(element)(scope);


// Error handling.
//
// Reset the compileGuard after compilation
// (otherwise we can't use this directive multiple times).
//
// It should be safe to reset here because we will
// only reach this code *after* the `$compile()`
// call above has returned.
compileGuard = 0;

}
};

}
};
}]);

关于angularjs - 有条件地将 Angular 指令属性添加到元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com