2013-05-20 12 views
37

Więc zasadniczo chcę móc wywołać zdarzenie, a następnie mieć dyrektywę skompilować i wstawić swoje ja do pozycji w DOM. Obecnie mam coś takiegoWstaw dyrektywnie programowo kątowo

//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'); 
     } 
    }; 
    }); 

jestem w stanie zobaczyć obiekt „EL” ze wszystkim, co potrzebne, ale nie jestem w stanie go wstawić do DOM ... żadnych wskazówek?

+0

Możliwy duplikat [Dynamicznie dodać dyrektywę w angularjs] (http://stackoverflow.com/questions/15279244/dynamically-add -directive-in-angularjs) –

Odpowiedz

46

Najpierw należy utworzyć element dom, a następnie skompilować go i dodać do dokumentu. Coś takiego:

$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; 
}; 

stworzyłem prosty przykład tutaj: http://plnkr.co/edit/n7SZpyeQ9nbjVSYA7ibB?p=preview

+4

W jaki sposób mam uzyskać dostęp do '$ compile', jeśli tworzyłem element poza Angular? – Hengjie

+0

Witam, czy mógłbyś przedstawić pomysły na temat mojego nowego proponowanego interfejsu API, aby programowo dodawać dyrektywy prostszym procesem? https://github.com/angular/angular.js/issues/6950 Dzięki! – trusktr

+1

@Hengjie Musi skompilować element w odniesieniu do określonego zakresu (wewnątrz kątowego). Nie ma żadnych dyrektyw poza kanciastą. Dyrektywy są powiązane z zakresami w Twojej aplikacji. Alternatywnie możesz użyć wewnętrznego jQLite wewnątrz kątowego i zrobić programy obsługi zdarzeń w ten sposób ('angle.element ('body')'). –