Durum
Angular uygulamamızın içinde, ng-bind-html-unsafe özniteliğine sahip bir div içeren, bir denetleyici tarafından desteklenen Sayfa adlı bir yönergedir. Bu, 'pageContent' adlı bir $ kapsam değişkenine atanır. Bu değişken, bir veritabanından dinamik olarak oluşturulmuş HTML'ye atanır. Kullanıcı bir sonraki sayfaya geçtiğinde, DB'ye bir çağrı yapılır ve pageContent değişkeni, ng-bind-html-unsafe aracılığıyla ekranda işlenen bu yeni HTML'ye ayarlanır. İşte kod:
Sayfa yönergesi
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
}
}
}
};
});
Sayfa yönergesinin şablonu (yukarıdaki templateUrl özelliğinden "page.html")
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
Sayfa denetleyicisi
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;
});
});
Bu işe yarıyor. Sayfanın DB'den gelen HTML'sinin tarayıcıda güzelce işlendiğini görüyoruz. Kullanıcı bir sonraki sayfaya geçtiğinde, sonraki sayfanın içeriğini görüyoruz ve bu böyle devam ediyor. Çok uzak çok iyi.
Sorun
Buradaki sorun, bir sayfanın içeriğinin içinde etkileşimli içeriğe sahip olmak istememizdir. Örneğin, HTML, kullanıcı üzerine tıkladığında, Angular'ın bir pop-up modal pencere görüntülemek gibi harika bir şey yapması gereken bir küçük resim içerebilir. Veritabanımızdaki HTML dizelerine Angular yöntem çağrıları (ng-tıklama) yerleştirdim, ancak tabii ki Angular, HTML dizesini bir şekilde ayrıştırmadığı, tanımadığı ve derlemediği sürece yöntem çağrılarını veya yönergeleri tanımayacaktır.
DB'mizde
Sayfa 1 için İçerik:
<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>
Sayfa 2 için İçerik:
<p>Here's a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
Sayfa denetleyicisine geri döndükten sonra ilgili $ kapsam işlevini ekliyoruz:
Sayfa denetleyicisi
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
Bu 'doSomethingAwesome' yöntemini DB'deki HTML dizesinin içinden nasıl çağıracağımı çözemiyorum. Angular'ın HTML dizesini bir şekilde ayrıştırması gerektiğinin farkındayım, ama nasıl? $ Compile hizmeti hakkında muğlak mırıltılar okudum ve bazı örnekleri kopyalayıp yapıştırdım ama hiçbir şey işe yaramıyor. Ayrıca, çoğu örnek dinamik içeriğin yalnızca direktifin bağlanma aşamasında ayarlandığını gösterir. Page'in uygulamanın ömrü boyunca hayatta kalmasını isteriz. Kullanıcı sayfalar arasında gezinirken sürekli olarak yeni içerik alır, derler ve görüntüler.
Soyut anlamda, Angular parçalarını bir Angular uygulamasına dinamik olarak yerleştirmeye çalıştığımızı ve bunları içeri ve dışarı değiştirebilmemiz gerektiğini söyleyebiliriz.
Çeşitli Angular dokümantasyon parçalarının yanı sıra her türden blog gönderisini ve insanların koduyla JS Fiddled okudum. Angular'ı tamamen yanlış mı anladığımı yoksa basit bir şeyi mi kaçırdığımı bilmiyorum ya da belki yavaşım. Her durumda, bazı tavsiyelerde bulunabilirim.