我希望有一个指令来检查组件的tag name
,并根据某些条件显示/隐藏组件。我希望显示隐藏的行为类似ng-if
(不初始化组件的控制器)。例如:
<my-component custom-if></my-component>
在指令custom-if
中:
return {
compile: function($element) {
if($element[0].tagName === 'some condition'){
//Element is my-component
$element.remove();
}
}
};
我遇到的问题是,即使我删除元素,它仍然会调用my-component的控制器。如果我删除指令的compile
或preLink
函数内的元素,也会发生同样的情况。我也尝试继承ng-if
但我无法在custom-if
指令中获取组件的标记名称,因为该元素是comment
(可能是ng-if
特定的行为在评论中包装元素)
更新:将postLink
功能更改为compile
,以确保其无法正常工作。它显示/隐藏了元素,但是总是实例化控制器,即使它已被删除,这就是我想要避免的内容
答案 0 :(得分:10)
我认为您应该能够通过制定customIf
高优先级指令来实现这一目标。然后在编译函数中,您可以检查是否允许主机组件/指令继续。如果没有,customIf
只会完全删除元素。如果检查通过,则customIf
需要通过取消设置自己的属性来删除自身,然后再次重新编译元素。
这样的事情:
.directive('customIf', function($compile) {
return {
priority: 1000000,
terminal: true,
compile: function(element, attrs) {
if (element[0].tagName === 'MY-COMPONENT') {
element.remove();
}
else {
// remove customIf directive and recompile
attrs.$set('customIf', null);
return function(scope, element) {
$compile(element)(scope);
}
}
}
};
});