2013-05-20 4 views
37

Так что я в основном хочу, чтобы иметь возможность запускать событие, а затем скомпилировать директиву и вставить ее в позицию в DOM. В настоящее время у меня есть что-то вроде этогоВставить директиву программно угловую

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

я в состоянии видеть объект «эль» со всем, что мне нужно, но я не в состоянии, чтобы вставить его в DOM ... любые улики?

+0

Возможный дубликат [Динамически добавить директиву в AngularJS] (http://stackoverflow.com/questions/15279244/dynamically-add -directive-in-angularjs) –

ответ

46

Сначала необходимо создать элемент dom, затем скомпилировать его и добавить в документ. Что-то вроде этого:

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

Я создал простой пример здесь: http://plnkr.co/edit/n7SZpyeQ9nbjVSYA7ibB?p=preview

+4

Как мне получить доступ к '$ compile', если бы я создал элемент вне Angular? – Hengjie

+0

Привет, не могли бы вы представить идеи по моему новому предлагаемому API, чтобы программно добавить директивы более простой процесс? https://github.com/angular/angular.js/issues/6950 Спасибо! – trusktr

+1

@Hengjie Он должен скомпилировать элемент со ссылкой на конкретный объем (внутри угловой). Нет никаких директив вне углового. Директивы привязаны к областям приложения. В качестве альтернативы вы можете использовать jQLite внутри угловых и обработчиков событий таким образом ('angular.element ('body')'). –

Смежные вопросы