Có hai cách để làm điều này; một sử dụng các chỉ thị trợ giúp đã có sẵn (như ngInclude
và ngController
) và thứ hai là hướng dẫn sử dụng; phiên bản thủ công có thể nhanh hơn, nhưng tôi không thể chắc chắn.
The Way dễ dàng:
Phương pháp dễ dàng là để đơn giản tạo ra một nguyên tố mới với ngController
và ngInclude
thuộc tính, thêm nó vào yếu tố của chỉ thị, và sau đó $compile
nó:
var html = '<div ng-controller="'+ctrl+'" ng-include="'+tpl+'"></div>';
element.append(html);
$compile(element.contents())(scope);
Hướng dẫn sử dụng:
Cách thủ công là tự làm những gì các chỉ thị này làm lần lượt; logic này là rất giống với những gì ngView
hiện (mặc dù không có sự phức tạp). Chúng tôi lấy mẫu, lưu trữ nó trong $templateCache
và sau đó nối nó vào DOM. Chúng ta tạo một phạm vi con mới và khởi tạo bộ điều khiển được cung cấp với nó và gán bộ điều khiển đó cho phần tử. Cuối cùng, chúng tôi $compile
nó:
$http.get(tpl, { cache: $templateCache })
.then(function(response) {
templateScope = scope.$new();
templateCtrl = $controller(ctrl, { $scope: templateScope });
element.html(response.data);
element.children().data('$ngControllerController', templateCtrl);
$compile(element.contents())(templateScope);
});
(Lưu ý rằng không có thu gom rác thải ở đây, mà bạn sẽ cần phải thực hiện nếu widget thay đổi)
Đây là một Plunker chứng minh cả hai phương pháp: http://plnkr.co/edit/C7x9C5JgUuT1yk0mBUmE?p=preview
Nguồn
2013-05-02 18:21:18
Đây là bản chất những gì 'ngView' làm; mặc dù trường hợp sử dụng của bạn đơn giản hơn một chút, nhưng bạn có thể thấy [mã nguồn] của mình (https://github.com/angular/angular.js/blob/master/src/ng/directive/ngView.js) hữu ích. Về cơ bản, bạn lấy, thêm vào DOM, và sau đó '$ compile' mẫu của bạn và sau đó gán bộ điều khiển:' element.children(). Data ('$ ngControllerController', controller); '. Nếu tôi có thời gian sau ngày hôm nay tôi sẽ gửi một phản ứng hoàn chỉnh hơn. –