2013-05-20 32 views
37

Quindi sostanzialmente voglio essere in grado di attivare un evento e quindi avere una direttiva compilare e inserirmi in una posizione nel DOM. Attualmente ho qualcosa di simileInserisci direttiva programmaticamente angolare

//controller 
    angular.module('app').controller('MainCtrl', function ($scope, $compile) { 

    $scope.$on('insertItem',function(ev,attrs){ 
     var el = $compile("<chart></chart>")($scope); 
     $scope.insertHere = el; 
    }); 

    }); 


// directive 
angular.module('app') 
    .directive('chart', function() { 
    return { 
     template: '<div>My chart</div>', 
     restrict: 'E', 
     link: function postLink(scope, element, attrs) { 
     element.text('this is a chart'); 
     } 
    }; 
    }); 

sono in grado di vedere l'oggetto "el" con tutto quello che ho bisogno, ma io non sono in grado di inserirlo nel DOM ... qualche indizio?

+0

Eventuali duplicati di [Aggiungere dinamicamente direttiva AngularJS] (http://stackoverflow.com/questions/15279244/dynamically-add -directive-in-angularjs) –

risposta

46

È necessario creare prima l'elemento dom, quindi compilarlo e aggiungerlo al documento. Qualcosa di simile a questo:

$scope.$on('insertItem',function(ev,attrs){ 
    var chart = angular.element(document.createElement('chart')); 
    var el = $compile(chart)($scope); 

    //where do you want to place the new element? 
    angular.element(document.body).append(chart); 

    $scope.insertHere = el; 
}; 

ho creato un semplice esempio qui: http://plnkr.co/edit/n7SZpyeQ9nbjVSYA7ibB?p=preview

+4

Come potrei accedere a '$ compile' se stavo creando l'elemento al di fuori di Angular? – Hengjie

+0

Ciao, vorresti fornire idee sulla mia nuova API proposta per rendere le direttive che aggiungono al programma un processo più semplice? https://github.com/angular/angular.js/issues/6950 Grazie! – trusktr

+1

@Hengjie Ha bisogno di compilare l'elemento con riferimento a un particolare ambito (all'interno angolare). Non ci sono direttive al di fuori di angolari. Le direttive sono legate agli ambiti all'interno della tua app. In alternativa puoi usare la jQLite all'interno di angular e fare in questo modo i gestori di eventi ('angular.element ('body')'). –

Problemi correlati