Situasi
Bersarang di dalam aplikasi Angular kami adalah arahan yang disebut Page, didukung oleh controller, yang berisi div dengan atribut ng-bind-html-unsafe. Ini ditugaskan ke $ scope var yang disebut 'pageContent'. Var ini akan diberikan HTML yang dihasilkan secara dinamis dari database. Ketika pengguna membalik ke halaman berikutnya, dipanggil ke DB dibuat, dan pageContent var diatur ke HTML baru ini, yang akan ditampilkan di layar melalui ng-bind-html-tidak aman. Berikut kodenya:
Arahan halaman
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
}
}
}
};
});
Templat direktif halaman ("page.html" dari properti templateUrl di atas)
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
Pengontrol halaman
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;
});
});
Itu bekerja. Kami melihat HTML laman dari DB yang ditampilkan dengan baik di peramban. Ketika pengguna membalik ke halaman berikutnya, kami melihat konten halaman berikutnya, dan seterusnya. Sejauh ini baik.
Masalah
Masalahnya di sini adalah bahwa kami ingin memiliki konten interaktif di dalam konten halaman. Misalnya, HTML dapat berisi gambar mini di mana, ketika pengguna mengkliknya, Angular harus melakukan sesuatu yang luar biasa, seperti menampilkan jendela modal pop-up. Saya telah menempatkan panggilan metode Angular (ng-klik) di string HTML di database kami, tapi tentu saja Angular tidak akan mengenali panggilan metode atau arahan kecuali entah bagaimana mem-parsing string HTML, mengenali mereka dan mengkompilasi mereka.
Dalam DB kami
Konten untuk Halaman 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>
Konten untuk Halaman 2:
<p>Here's a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
Kembali ke pengontrol halaman, kami kemudian menambahkan fungsi $ scope yang sesuai:
Pengontrol halaman
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
Saya tidak tahu bagaimana memanggil metode 'doSomethingAwesome' dari dalam string HTML dari DB. Saya menyadari Angular harus mengurai string HTML, tetapi bagaimana caranya? Saya telah membaca gumaman samar tentang layanan $ compile, dan menyalin dan menempel beberapa contoh, tetapi tidak ada yang berhasil. Juga, sebagian besar contoh menunjukkan konten dinamis hanya diatur selama fase penautan arahan. Kami ingin Page tetap hidup sepanjang masa aplikasi. Terus menerima, mengkompilasi dan menampilkan konten baru saat pengguna membalik-balik halaman.
Dalam arti abstrak, saya kira Anda bisa mengatakan kami mencoba untuk secara dinamis memotong sarang Angular dalam aplikasi Angular, dan harus dapat menukar mereka masuk dan keluar.
Saya telah membaca berbagai bit dokumentasi Angular beberapa kali, dan juga segala macam posting blog, dan JS Mengotak-atik kode orang. Saya tidak tahu apakah saya benar-benar salah paham tentang Angular, atau hanya melewatkan sesuatu yang sederhana, atau mungkin saya lambat. Bagaimanapun, saya bisa menggunakan beberapa saran.
Jawaban:
ng-bind-html-unsafe
hanya menjadikan konten sebagai HTML. Itu tidak mengikat lingkup sudut ke DOM yang dihasilkan. Anda harus menggunakan$compile
layanan untuk tujuan itu. Saya membuat plunker ini untuk mendemonstrasikan cara menggunakan$compile
untuk membuat directive rendering dynamic HTML yang dimasukkan oleh pengguna dan mengikat ke lingkup controller. Sumber diposting di bawah ini.demo.html
script.js
sumber
$compile(ele.contents())(scope);
- baris ini memecahkan masalah saya tidak mengkompilasi komponen sudut yang ditambahkan secara dinamis. Terima kasih.Di sudut 1.2.10 baris
scope.$watch(attrs.dynamic, function(html) {
mengembalikan kesalahan karakter yang tidak valid karena mencoba untuk melihat nilaiattrs.dynamic
yang merupakan teks html.Saya memperbaikinya dengan mengambil atribut dari properti scope
Contoh saya
sumber
$compile(ele.contents())(scope);
- baris ini memecahkan masalah saya tidak mengkompilasi komponen sudut yang ditambahkan secara dinamis. Terima kasih.Ditemukan dalam grup diskusi google. Bekerja untukku.
sumber
Kamu bisa memakai
arahan untuk mengikat html secara dinamis. Namun Anda harus mendapatkan data melalui layanan $ sce.
Silakan lihat demo langsung di http://plnkr.co/edit/k4s3Bx
sumber
var myApp = angular.module('myApp', ['ngSanitize']);
Coba kode di bawah ini untuk mengikat html melalui attr
Coba element.html ini (scope.dynamic); dari element.html (attr.dynamic);
sumber