2012-07-11 2 views
17

Ho una direttiva piuttosto semplice che voglio caricare il modello da un file HTML separato. Voglio che l'HTML sostituisca la direttiva e quindi aggiungo la proprietà replace: true alla direttiva. Tuttavia, quando lo faccio, il modello non viene affatto incluso.AngularJS - Perché non sostituisce: vero lavoro con la proprietà templateUrl?

Ho creato un jsFiddle dove è possibile vedere questo. Se usi Firebug o qualcosa per ispezionare il DOM, puoi vedere che quando usa solo la proprietà template sostituisce l'elemento. Se si toglie il numero replace: true, è possibile visualizzare l'HTML allo templateUrl accodandosi all'elemento foo. Tuttavia, non appena aggiungo lo replace: true allo templateUrl, tutto ciò che vedo è <foo></foo> nel DOM.

C'è qualche ragione per cui non è possibile utilizzare queste due proprietà insieme? Sono lontano da un esperto con javascript, quindi qualsiasi informazione su ciò che sta accadendo qui sarebbe molto apprezzata.

+0

vedere [qui] (https://github.com/angular/angular.js/issues/1459) se stai lavorando con le tabelle –

risposta

34

Assicurarsi che il contenuto del codice HTML nello templateUrl abbia esattamente un elemento radice. Questo non è un problema quando replace: false ma diventa un problema quando replace: true e vedrete questo errore Console (con Firebug):

Error: Template must have exactly one root element. 

Ecco una jsFiddle di esso not working (con due elementi di root) e un altro con esso working .

+8

Il mio file html aveva alcuni commenti al di fuori del mio elemento di livello principale. Ho pensato che i commenti andassero bene, ma quando ho rimosso tutti i commenti esterni e ho avuto solo un div esterno, ha funzionato bene. Grazie! – dnc253

+3

Qualcuno ha avuto fortuna con l'utilizzo di tag di riga tabella? Se si sostituisce l'esempio di lavoro con tr td smette di funzionare ... – toxaq

+0

@toxaq Per i tag di riga tabella ho commutato la direttiva di tipo "E" a una direttiva di tipo "A". – JisuKim82

1

Buona domanda. Se non mi sbaglio, che si desidera utilizzare "transclude"

http://jsfiddle.net/dandoyon/AsVp8/1/

Transclude permette di fondere il modello con ciò che è nel codice HTML. Puoi dare un'altra occhiata al doc e cercare questa opzione.

evviva!

+0

Se non sbaglio, non ti escludono solo ti permetto di mettere il contenuto del tag nel risultato finale? Questo non è quello che sto volendo. Voglio solo il mio tag completamente sostituito da ciò che è nel modello. La parte blah blah nel mio jsFiddle era solo per garantire che quella parte del tag fosse sparita nel risultato finale. – dnc253

+0

Ok. Bene http://jsfiddle.net/dandoyon/AsVp8/2/ (che penso fosse quello che avevi prima) funziona e sostituisce ciò che è lì. Mi sto perdendo qualcosa? Quale browser stai usando? IE ha bisogno di particolari considerazioni che devono avvenire per IE. Fammi sapere se è questo il problema. Ho scritto qualcosa per angular-ui per autoshiv le nostre direttive. https://github.com/angular-ui/angular-ui/blob/master/common/ieshiv/src/ieshiv.js –

+0

Il problema era con la proprietà templateUrl commentata. Non c'è modo per me di avere jsFiddle per colpire il mio file html locale, quindi ho solo messo un URL che potrebbe colpire. Con le informazioni menzionate da Gloopy sono stato in grado di capire che erano i commenti fuori dal mio livello di root div a causare il problema. – dnc253