2015-02-22 2 views
6

Va bene, così ho creato una direttiva diciamoCome ricompilare una direttiva dopo l'inserimento nel DOM (angularjs)

<calendar></calendar> 

Essa viene reso come mi aspettavo così tutto funziona bene. Ora, la mia domanda è come (ri) renderlo quando inserito nel DOM? Non voglio usarlo sempre sulla mia pagina, voglio solo aggiungerlo dinamicamente e renderizzarlo solo quando ne ho bisogno (è una parte di un modulo), diciamo, idealmente voglio che appaia come

$("body").append("<calendar></calendar>") 

Come posso ottenere questo con angularjs?

risposta

3

È necessario scrivere due righe di sotto dove si vuole iniettare il vostro elemento direttiva per DOM, non dimenticare di aggiungere $document & Dipendenza $compile ovunque tu la usi.

var template = '<calender></calender>', 
    body = $document.find('body'); 
body.append($compile(template)(scope)); 
+0

Ecco, questo è in realtà significa creare un'altra direttiva che compilerà la mia direttiva? No, mi piacerebbe trovare una soluzione a una linea –

+0

@ CarterăVeaceslav questo codice dice che è possibile iniettare la direttiva 'calender' usando le linee all'interno del collegamento della direttiva fucntion .. –

+0

Perché è così complicato da ottenere in angolare? Con "plain" jQuery scrivo $ ("# mySelector"). MyModuleName ({... my parameters}) e posso facilmente renderizzare i miei moduli personalizzati dove li voglio e quando voglio loro ... –

1

La sequenza delle azioni è questo:

  1. Crea elemento DOM o angular.element oggetto:

    var calendar = angular.element('<calendar></calendar>'), 
    
  2. passarlo al $compile servizio. In questa fase è necessario fornire necessarie oggetto campo di applicazione:

    $compile(calendar)(scope); 
    
  3. Append calendar elemento di documento:

    angular.element('body').append(calendar); 
    

Quindi tutti insieme appare come:

var calendar = angular.element('<calendar></calendar>'); 
$compile(calendar)(scope); 
angular.element('body').append(calendar); 
+0

(2) $ compile non è definito –

+0

È necessario inserirlo nel servizio/controller. – dfsq

+0

Vedi questa demo: http://plnkr.co/edit/ZNLwZAjtDtxLs1S9BVyf?p=preview – dfsq

0

È puoi usare il servizio $ compile per ricompilarlo e usare angular.element ('body'). append per aggiungerlo al pa ge di nuovo. Ad esempio:

var el = $compile("<calendar></calendar>")($scope); 
    angular.element('body').append(el); 
2

Può essere realizzato con elemento angolare:

angular.element('body').append($compile("<calendar></calendar>")($scope)); 
+0

L'ho provato direttamente dalla console di Chrome, dice "$ compile non è definito". Cosa mi manca? –

+0

@ CarterăVeaceslav include la dipendenza '$ compile' nella funzione direttiva –

+0

Impossibile farlo funzionare, la mia direttiva è w_calendar.directive (" wcalendar ", function ($ compile) { return { restrict:" AE ", templateUrl: "templates/w_calendar.html", sostituire: true }; }); –