Tình huống
Được lồng trong ứng dụng Angular của chúng tôi là một lệnh được gọi là Trang, được hỗ trợ bởi bộ điều khiển, chứa div với thuộc tính ng-bind-html-không an toàn. Điều này được gán cho một var phạm vi $ được gọi là 'pageContent'. Var này được gán HTML được tạo động từ cơ sở dữ liệu. Khi người dùng lật sang trang tiếp theo, một lệnh gọi tới DB được tạo và varContent page được đặt thành HTML mới này, được hiển thị trên màn hình thông qua ng-bind-html-không an toàn. Đây là mã:
Chỉ thị trang
angular.module('myApp.directives')
.directive('myPage', function ($compile) {
return {
templateUrl: 'page.html',
restrict: 'E',
compile: function compile(element, attrs, transclude) {
// does nothing currently
return {
pre: function preLink(scope, element, attrs, controller) {
// does nothing currently
},
post: function postLink(scope, element, attrs, controller) {
// does nothing currently
}
}
}
};
});
Mẫu của chỉ thị trang ("page.html" từ thuộc tính templateUrl ở trên)
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
Trình điều khiển trang
angular.module('myApp')
.controller('PageCtrl', function ($scope) {
$scope.pageContent = '';
$scope.$on( "receivedPageContent", function(event, args) {
console.log( 'new page content received after DB call' );
$scope.pageContent = args.htmlStrFromDB;
});
});
Điều đó làm việc. Chúng tôi thấy HTML của trang từ DB được hiển thị độc đáo trong trình duyệt. Khi người dùng lật sang trang tiếp theo, chúng tôi sẽ thấy nội dung của trang tiếp theo, v.v. Càng xa càng tốt.
Vấn đề
Vấn đề ở đây là chúng tôi muốn có nội dung tương tác bên trong nội dung của trang. Chẳng hạn, HTML có thể chứa hình ảnh thu nhỏ trong đó, khi người dùng nhấp vào nó, Angular sẽ làm một cái gì đó tuyệt vời, chẳng hạn như hiển thị một cửa sổ phương thức bật lên. Tôi đã đặt các cuộc gọi phương thức Angular (ng-click) trong các chuỗi HTML trong cơ sở dữ liệu của chúng tôi, nhưng tất nhiên Angular sẽ không nhận ra các cuộc gọi hoặc chỉ thị phương thức trừ khi bằng cách nào đó phân tích chuỗi HTML, nhận ra chúng và biên dịch chúng.
Trong DB của chúng tôi
Nội dung cho Trang 1:
<p>Here's a cool pic of a lion. <img src="lion.png" ng-click="doSomethingAwesone('lion', 'showImage')" > Click on him to see a large image.</p>
Nội dung cho Trang 2:
<p>Here's a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
Quay lại trình điều khiển Trang, sau đó chúng ta thêm hàm $ scope tương ứng:
Trình điều khiển trang
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
Tôi không thể tìm ra cách gọi phương thức 'doS SomethingAwgie' từ trong chuỗi HTML từ DB. Tôi nhận ra Angular phải phân tích chuỗi HTML bằng cách nào đó, nhưng bằng cách nào? Tôi đã đọc những lời lầm bầm mơ hồ về dịch vụ $ compile, và sao chép và dán một số ví dụ, nhưng không có gì hoạt động. Ngoài ra, hầu hết các ví dụ cho thấy nội dung động chỉ được thiết lập trong giai đoạn liên kết của chỉ thị. Chúng tôi muốn Trang tồn tại trong suốt vòng đời của ứng dụng. Nó liên tục nhận, biên dịch và hiển thị nội dung mới khi người dùng lật qua các trang.
Theo một nghĩa trừu tượng, tôi đoán bạn có thể nói rằng chúng tôi đang cố gắng tự động lồng các khối Angular trong một ứng dụng Angular và cần có thể trao đổi chúng vào và ra.
Tôi đã đọc nhiều mẩu tài liệu Angular nhiều lần, cũng như tất cả các loại bài đăng trên blog và JS được xử lý bằng mã của mọi người. Tôi không biết liệu tôi hoàn toàn hiểu nhầm Angular hay chỉ thiếu một cái gì đó đơn giản, hoặc có thể tôi chậm. Trong mọi trường hợp, tôi có thể sử dụng một số lời khuyên.