2013-05-20 58 views
37

Vì vậy, về cơ bản tôi muốn có thể kích hoạt một sự kiện và sau đó có một biên dịch chỉ thị và chèn tự của nó vào một vị trí trong DOM. Hiện nay tôi có một cái gì đó như thế nàyChèn chỉ thị theo chương trình góc

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

tôi có thể thấy đối tượng "el" với tất cả những gì tôi cần, nhưng tôi không thể để chèn nó vào DOM ... bất kỳ manh mối?

+0

có thể trùng lặp của [Tự động thêm chỉ thị trong AngularJS] (http://stackoverflow.com/questions/15279244/dynamically-add -directive-in-angularjs) –

Trả lời

46

Trước tiên bạn phải tạo phần tử dom, sau đó biên dịch nó và thêm nó vào tài liệu. Một cái gì đó như thế này:

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

tôi đã tạo ra một ví dụ đơn giản ở đây: http://plnkr.co/edit/n7SZpyeQ9nbjVSYA7ibB?p=preview

+4

Làm cách nào để truy cập '$ compile' nếu tôi tạo phần tử bên ngoài Angular? – Hengjie

+0

Xin chào, bạn vui lòng cung cấp ý tưởng về API được đề xuất mới của tôi để làm cho chỉ thị thêm lập trình một quy trình đơn giản hơn? https://github.com/angular/angular.js/issues/6950 Cảm ơn! – trusktr

+1

@Hengjie Nó cần biên dịch phần tử với tham chiếu đến một phạm vi cụ thể (bên trong góc). Không có chỉ thị nào ngoài góc cạnh. Chỉ thị được gắn với phạm vi trong ứng dụng của bạn. Cách khác bạn có thể sử dụng jqlite bên trong góc và làm xử lý sự kiện theo cách đó ('angular.element ('body')'). –

Các vấn đề liên quan