สถานการณ์
ซ้อนอยู่ภายในแอป Angular ของเราเป็นคำสั่งที่เรียกว่า Page ซึ่งได้รับการสนับสนุนโดยคอนโทรลเลอร์ซึ่งมี div ที่มีแอตทริบิวต์ ng-bind-html-unsafe สิ่งนี้ถูกกำหนดให้กับ $ scope var ที่เรียกว่า 'pageContent' ตัวแปรนี้ได้รับการกำหนด HTML ที่สร้างขึ้นแบบไดนามิกจากฐานข้อมูล เมื่อผู้ใช้พลิกไปที่หน้าถัดไปจะมีการเรียกไปยังฐานข้อมูลและ pageContent var ถูกตั้งค่าเป็น HTML ใหม่นี้ซึ่งจะแสดงผลบนหน้าจอผ่าน ng-bind-html-unsafe นี่คือรหัส:
คำสั่งเพจ
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
}
}
}
};
});
เทมเพลตของคำสั่งเพจ ("page.html" จากคุณสมบัติ templateUrl ด้านบน)
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
ตัวควบคุมหน้า
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;
});
});
ที่ได้ผล เราเห็น HTML ของหน้าจาก DB ที่แสดงผลอย่างสวยงามในเบราว์เซอร์ เมื่อผู้ใช้พลิกไปที่หน้าถัดไปเราจะเห็นเนื้อหาของหน้าถัดไปและอื่น ๆ จนถึงตอนนี้ดีมาก
ปัญหา
ปัญหาคือเราต้องการให้มีเนื้อหาเชิงโต้ตอบภายในเนื้อหาของเพจ ตัวอย่างเช่น HTML อาจมีภาพขนาดย่อที่เมื่อผู้ใช้คลิกที่ Angular ควรทำสิ่งที่ยอดเยี่ยมเช่นการแสดงหน้าต่างโมดอลป๊อปอัป ฉันได้วางการเรียกเมธอด Angular (ng-click) ไว้ในสตริง HTML ในฐานข้อมูลของเรา แต่แน่นอนว่า Angular จะไม่รู้จักการเรียกใช้วิธีการหรือคำสั่งเว้นแต่จะแยกวิเคราะห์สตริง HTML จดจำและรวบรวมข้อมูลเหล่านี้
ในฐานข้อมูลของเรา
เนื้อหาสำหรับหน้า 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>
เนื้อหาสำหรับหน้า 2:
<p>Here's a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
กลับไปที่ตัวควบคุมหน้าจากนั้นเราจะเพิ่มฟังก์ชัน $ scope ที่เกี่ยวข้อง:
ตัวควบคุมหน้า
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
ฉันคิดไม่ออกว่าจะเรียกเมธอดนั้น 'doSomethingAwesome' ได้อย่างไรจากในสตริง HTML จาก DB ฉันรู้ว่า Angular ต้องแยกวิเคราะห์สตริง HTML แต่อย่างไร ฉันได้อ่านคำพูดที่คลุมเครือเกี่ยวกับบริการคอมไพล์ $ และคัดลอกและวางตัวอย่างบางส่วน แต่ไม่มีอะไรได้ผล นอกจากนี้ตัวอย่างส่วนใหญ่จะแสดงเนื้อหาแบบไดนามิกเฉพาะที่ได้รับการตั้งค่าในช่วงการเชื่อมโยงของคำสั่ง เราต้องการให้เพจมีชีวิตอยู่ตลอดชีวิตของแอป มันรับรวบรวมและแสดงเนื้อหาใหม่อย่างต่อเนื่องเมื่อผู้ใช้พลิกดูหน้าต่างๆ
ในแง่นามธรรมฉันเดาว่าคุณอาจพูดได้ว่าเรากำลังพยายามซ้อนชิ้นส่วนของ Angular ภายในแอป Angular แบบไดนามิกและจำเป็นต้องสามารถสลับเข้าและออกได้
ฉันได้อ่านเอกสาร Angular หลาย ๆ ครั้งรวมถึงบล็อกโพสต์ทุกประเภทและ JS Fiddled with people code ฉันไม่รู้ว่าฉันเข้าใจ Angular ผิดไปหมดหรือขาดอะไรง่ายๆไปหรือบางทีฉันก็ทำงานช้า ไม่ว่าในกรณีใดฉันสามารถใช้คำแนะนำได้