2016-05-05 20 views
9

Desidero avere una direttiva che controlli il componente tag name e in base a qualche condizione mostri/nasconda il componente. Voglio mostrare che si nasconde per comportarsi come ng-if (non inizializzando il controller del componente). Esempio:Direttiva angolare ng-if

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

All'interno della direttiva custom-if:

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

Il problema che ho è che, anche se tolgo elemento si chiama ancora controllore della mia componente. Lo stesso accade se rimuovo l'elemento all'interno della funzione compile o preLink della direttiva. Ho anche cercato di ereditare ng-if ma non riesco a ottenere il nome del tag del componente all'interno custom-if direttiva, poiché l'elemento è un comment (probabilmente lo è ng-if comportamento specifico per avvolgere elemento all'interno commento)

UPDATE: Modificato postLink funzione a compile per assicurarsi che non funzioni altrettanto bene. Essa mostra/nasconde l'elemento ma crea un'istanza sempre regolatore anche se viene rimosso ed è quello che voglio evitare

+0

Invece di fare la logica in collegamento spostarlo per la compilazione. Facendolo lì dovrebbe permetterti di rimuovere quell'elemento dal DOM e anche escludere quell'elemento dal collegamento. –

+0

non aiuta. L'ho scritto all'interno della domanda – jonasnas

+0

Ok, ma la chiave è di dire a $ compilatore di saltare la fase di collegamento della compilazione del modello in funzione di compilazione. E il compilatore restituisce sempre la funzione di collegamento che avrà sempre accesso al controller (come quarto argomento) quindi, a meno che non ti fermi a compilare, otterrai sempre un controller. Buona domanda a proposito. –

risposta

9

penso che si dovrebbe essere in grado di farlo facendo customIf alta direttiva priorità. Quindi, nella funzione di compilazione, è possibile verificare se il componente/la direttiva dell'host è autorizzato a continuare o meno. In caso contrario, customIf rimuove completamente l'elemento. Se il controllo passa, allora customIf ha bisogno di rimuovere se stesso disattivando il proprio attributo e quindi ricompilare nuovamente l'elemento.

Qualcosa di simile a questo:

.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

In infatti, 'priority: 1' sarebbe sufficiente. [plunker] (https://plnkr.co/edit/AnlxqenYQOXjOiFdWOvi?p=preview) – Daniel

+1

@Daniel Quindi non funzionerà se 'myComponent' ha priorità alta. Ci sono alcune direttive che hanno priorità più alta di 1. Ma vogliamo ancora customIf per eseguire il primo per tutte. – dfsq

+0

Posso accedere al valore di 'custom-if =" $ ctrl.smth "' dalla compilazione? Ad esempio, se voglio controllare la funzione di compilazione interna 'if ($ ctrl.smth [$ element [0] .tagName])' – jonasnas

Problemi correlati