2016-05-05 53 views
9

我想要一个指令,检查组件tag name,并根据某些条件显示/隐藏组件。我想隐藏起来像ng-if(不初始化组件的控制器)。例如:角ng,如果像指令

<my-component custom-if></my-component> 

指令custom-if内部:

return { 
    compile: function($element) { 
    if($element[0].tagName === 'some condition'){ 
     //Element is my-component 
     $element.remove(); 
    } 
    } 
}; 

我的问题是,即使我删除元素它仍然呼吁控制器我组分的。如果我删除指令的compilepreLink函数中的元素,也会发生同样的情况。我也试图继承ng-if,但我不能让组件的标签名内custom-if指令,因为该元素是一个comment(可能是ng-if特定的行为来包装里面comment元素)

UPDATE:改变postLink功能到compile,以确保它不能正常工作。显示/隐藏元素,但即使是删除它总是实例化控制器,这就是我想避免

+0

而不是做你的逻辑链路的移动它来编译。在那里做它应该允许你从DOM中删除该元素,并且从链接中排除该元素。 –

+0

它没有帮助。我在问题 – jonasnas

+0

中写道好了,但关键是告诉$编译器在编译函数中跳过模板编译的链接阶段。编译器总是返回总是有权访问控制器的链接函数(作为第四个参数),所以除非你停止编译,否则你总是会得到一个控制器。很好的问题btw。 –

回答

9

什么,我认为你应该能够通过使customIf HIGHT优先指令去做。然后在编译函数中,您可以检查是否允许主机组件/指令继续。如果不是,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); 
     } 
     } 
    } 
    }; 
}); 

演示:http://plnkr.co/edit/Y64i7K4vKCF1z3md6LES?p=preview

+0

In事实上,“优先:1”就足够了。 [plunker](https://plnkr.co/edit/AnlxqenYQOXjOiFdWOvi?p=preview) – Daniel

+1

@Daniel如果'myComponent'具有高优先级,那么它将不起作用。有一些指令的优先级高于1.但是我们仍然希望customIf为它们全部执行第一个指令。 – dfsq

+0

我可以从编译中访问'custom-if =“$ ctrl.smth”'的值吗?例如,如果我想检查内部编译函数if($ ctrl.smth [$ element [0] .tagName])' – jonasnas