2013-05-20 7 views
37

Also ich möchte im Grunde in der Lage sein, ein Ereignis auszulösen und dann eine Direktive kompilieren und seine selbst an einer Position im DOM einfügen. Zur Zeit habe ich so etwas wie dieseInsert-Anweisung programmatisch Winkel

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

ich in der Lage bin mit all das Objekt „el“, um zu sehen, die ich brauche, aber ich bin nicht in der Lage in den DOM ... irgendwelche Hinweise einfügen?

+0

Mögliche Duplikat [Dynamisch hinzufügen Richtlinie in AngularJS] (http://stackoverflow.com/questions/15279244/dynamically-add -directive-in-angularjs) –

Antwort

46

Sie müssen zunächst das dom-Element erstellen, dann kompilieren und zum Dokument hinzufügen. Etwas wie folgt aus:

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

ich ein einfaches Beispiel hier erstellt haben: http://plnkr.co/edit/n7SZpyeQ9nbjVSYA7ibB?p=preview

+4

Wie würde ich auf '$ compile' zugreifen, wenn ich das Element außerhalb von Angular erstellen würde? – Hengjie

+0

Hallo, würden Sie bitte Ideen zu meiner neuen vorgeschlagenen API bereitstellen, um das programmatische Hinzufügen von Anweisungen zu einem einfacheren Prozess zu machen? https://github.com/angular/angular.js/issues/6950 Danke! – trusktr

+1

@Hengjie Es muss das Element mit Bezug auf einen bestimmten Bereich (Innenwinkel) kompiliert werden. Es gibt keine Anweisungen außerhalb von eckigen. Richtlinien sind an Bereiche in Ihrer App gebunden. Alternativ können Sie die jQLite in angular verwenden und Ereignishandler auf diese Weise ausführen ('angular.element ('body')'). –