2016-05-05 23 views
9

Bileşenin tag name bileşenini denetleyen ve bazı koşullara göre bileşeni gösteren/gizleyen bir yönergeye sahip olmak istiyorum. Gizlemenin ng-if gibi davranmasını (komponentin kontrolörünü başlatma değil) göstermeyi istiyorum. Örnek: yönergesi custom-if İçindeYöngüdümlü yönerge

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

:

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

Ben sorun ben elemanı kaldırmak bile hala kontrolör my-bileşeninin çağırır olmasıdır. compile veya preLink yönergesinin içindeki yönergeyi kaldırırsam, aynı şey olur. Değişti postLink fonksiyonu: Ben de ng-if miras çalıştı ama eleman bir comment çünkü custom-if yönergesi içindeki bileşenin etiket adını alamayan

UPDATE (muhtemelen yorumun içindeki elemanı sarmak için ng-if özgü bir davranıştır) Ayrıca çalışmadığından emin olmak için compile. Bu/elementi gizler ama her zaman çıkarılsa bile kontrolörü başlatır ve ben

+0

bağlantı yerine, size mantık yapmanın derlemek taşıyın. Bunu yapmak o öğeyi DOM'dan kaldırmanıza izin vermeli ve ayrıca o öğeyi bağlantıdan hariç tutacaktır. –

+0

bu yardımcı olmuyor. Ben soru – jonasnas

+0

Tamam yazdım ama anahtar derleme işlevinde şablon derleme bağlantı aşamasını atlamak için $ derleyicisine söylemek. Ve derleyici her zaman denetleyiciye (dördüncü argüman olarak) erişecek olan bağlantı işlevini döndürür, böylece derlemeyi durdurmazsanız her zaman bir denetleyici alırsınız. İyi soru btw. –

cevap

9

kaçınmak istediği bu gösteriyor Sana customIf yüksekliği öncelik direktifini yaparak bunu yapmak mümkün olmalıdır düşünüyorum. Daha sonra derleme işlevinde, ana makine bileşeninin/yönergesinin devam etmesine izin verilip verilmediğini kontrol edebilirsiniz. Değilse, customIf sadece öğeyi tamamen kaldırır. Kontrol geçtiyse, customIf'un kendi özniteliğini kaldırarak kendini kaldırması ve ardından öğeyi yeniden derlemesi gerekir. Böyle

şey:

.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); 
     } 
     } 
    } 
    }; 
}); 

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

+0

Aslında, öncelik: 1 'yeterli olur. [plunker] (https://plnkr.co/edit/AnlxqenYQOXjOiFdWOvi?p=preview) – Daniel

+1

@Daniel Sonra 'myComponent' yüksek önceliğe sahipse işe yaramaz. 1'den daha yüksek önceliğe sahip olan bazı direktifler var. Ama yine de hepsinin ilkini yürütmek için özel bir istek istiyoruz. – dfsq

+0

Derlemeden "custom-if =" $ ctrl.smth "' değerine erişebilir miyim? Örneğin eğer derleme işlevini kontrol etmek istersem 'if ($ ctrl.smth [$ element [0] .tagName])' – jonasnas

İlgili konular