2016-05-05 51 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