2013-08-28 11 views
8

(1) Ho una direttiva transitoria denominata portlet che prende il suo contenuto e lo avvolge in un codice di codice. Ad esempio:AngularJS: come si possono escludere più direttive?

<portlet> 
    <div class="foobar">My content</div> 
</portlet> 

passa attraverso il modello di portlet, che è:

<div class="portlet"> 
    <div class="icon"></div> 
    <div class="content" ng-transclude="">   
    </div> 
</div> 

E diventa:

<div class="portlet"> 
    <div class="icon"></div> 
    <div class="content"> 
     <div class="foobar">My content</div> <!--the original content 
             passed to portlet--> 
    </div> 

(2) Ho altre due direttive, dyn-form e dyn-form-field . Descritto in questo modo:

<dyn-form> 
    <dyn-form-field type="textbox" placeholder="..." label="Name" /> 
    <! ...and so on... --> 
</dyn> 

dyn-form 's template:

<form class="..." ng-transclude=""> 
</form> 

Ogni dyn-field' s template genera il codice HTML per produrre l'etichetta/campi per esso. Così il codice originale è tradotto in qualcosa di simile a questo:

<form class="..."> 
    <label>Name: <input type="text" placeholder="..." /></label> 
    <!- ....and so on... --> 
</form> 

(3) Ecco il problema. Voglio utilizzare una terza direttiva, dyn-form-portlet per la generazione del codice boilerplate per la visualizzazione di alcuni pulsanti mostrati sopra ogni modulo, quindi mostrare un portlet e inserire dyn-form all'interno del portlet. Questo è il modo che sto cercando di fare questo:

modello
<dyn-form-portlet> 
    <dyn-form> 
    <dyn-form-field /> 
    </dyn-form> 
</dyn-form-portlet> 

s' dyn-form-portlet si presenta così:

<div class="dyn-form-portlet"> 
    <button>Foo</button> 
    <button>Bar</button> 
    <portlet ng-transclude=""> 
    </portlet> 
</div>  

Teoricamente questo dovrebbe funzionare, cioè <dyn-form> deve essere posto all'interno <portlet>, <dyn-form-field> s all'interno <dyn-form> , e così via. Ma quando eseguo questo, vedo solo i pulsanti visualizzati da dyn-form-portlet e il codice per portlet, ma portlet è vuoto e il modulo non viene visualizzato in esso.

Sto facendo qualcosa di sbagliato, o si tratta di un bug?

+1

Realizzato un plunk se c'è qualcuno interessato: http://plnkr.co/edit/FUYCQbw8Tnx3Qhcj4108?p=preview Se rimuovi la transclude: true dal portlet, funziona ma non sono sicuro delle implicazioni. –

+1

Ecco quello che credo stia accadendo. La direttiva '' all'interno del modello 'dyn-form-portlet' viene compilata da Angular prima che la direttiva sia collegata, quindi quando' dyn-form-portlet' viene elaborato, il tag 'portlet' all'interno del suo template è già stato reso. Dai un'occhiata a questo [Plunker] (http://plnkr.co/edit/szuDxjGPB8id2yrto7zM?p=preview) e controlla l'output della console. Non so se questo è un bug o solo il comportamento naturale angolare in questo caso. –

+0

@MichaelBenford Questo è davvero ciò che sembra accadere, tuttavia sembra un bug. Voglio dire, tutte le sotto-direttive all'interno di 'dyn-form' sono transientate in' dyn-form', quindi perché dovrebbe essere diverso per 'dyn-form-portlet' e' dyn-form'? Qualcuno può segnalare questo come un bug al team di AngularJS? –

risposta

5

Sono riuscito a risolvere il problema. Ho usato transclude : 'element' insieme a replace : true sulla direttiva portlet e l'ho dato a priority più alto di altre direttive. Il motivo per cui l'ho fatto è piuttosto la sensazione di una profonda conoscenza dei meccanismi interiori di Anuglar.

chi prima parte transclude : 'element' viene utilizzato perché

'elemento' - transclude l'intero elemento incluse le direttive definite a priorità inferiore.

Sostituisci è utilizzato perché da quello che ho visto viene sempre utilizzato quando transclude è impostato su elemento. La priorità era la mia impressione.

Ecco la plnkr http://plnkr.co/edit/axQ90dHOLmLNeNQ4ZlNl?p=preview

Questo probabilmente non è la risposta che stavate cercando, ma avrebbe bisogno di guardare in profondità in direttive angolari per capire veramente cosa sta succedendo. Ad ogni modo, non è un bug, è solo una scarsa documentazione.

Problemi correlati