从数据库编译动态HTML字符串 [英] Compiling dynamic HTML strings from database

查看:115
本文介绍了从数据库编译动态HTML字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

情况



在Angular应用程序中嵌套的是一个名为Page的指令,由一个控制器支持,其中包含一个带有ng-bind-html-unsafe属性的div 。这被分配给一个名为'pageContent'的$ scope var。这个var从数据库中获取动态生成的HTML。当用户翻到下一页时,会调用数据库,并将pageContent var设置为这个新的HTML,它通过ng-bind-html-unsafe在屏幕上呈现。以下是代码:

页面指令

 <$ c $ ('myPage',function($ compile){

return {
templateUrl:'page.html') ,
restrict:'E',
编译:函数compile(元素,attrs,transclude){
//目前不做任何操作
return {
pre:function preLink (范围,元素,attrs,控制器){
//目前不做任何操作
},
post:function postLink(scope,element,attrs,controller){
//目前没有任何
}
}
}
};
});

Page指令的模板(page.html来自上面的templateUrl属性)

 < div ng-controller =PageCtrl> 
...
<! - 动态页面内容写入下面的div - >
< div ng-bind-html-unsafe =pageContent>
...
< / div>

页面控制器

($ scope){
$ b $ scope.pageContent = '';
$ b $ scope。$ on(receivedPageContent,function(event,args){
console.log('数据库调用后收到的新页面内容');
$ scope.pageContent = args.htmlStrFromDB;
});

});

有效。我们在浏览器中看到了来自数据库的页面HTML。当用户翻到下一页时,我们会看到下一页的内容,等等。到目前为止这么好。

问题



这里的问题是我们希望在一个页面的内容。例如,HTML可能包含一个缩略图图像,当用户点击它时,Angular应该做一些很棒的事情,比如显示一个弹出式模式窗口。我在数据库中的HTML字符串中放置了Angular方法调用(ng-click),但是当然Angular不会识别任何方法调用或指令,除非它以某种方式解析HTML字符串,识别它们并编译它们。 / p>

在我们的数据库中



第1页的内容:

 < p>下面是一张很酷的狮子图片。 < img src =lion.pngng-click =doSomethingAwesone('lion','showImage')>点击他可以查看大图片。< / p> 

第2页的内容:

 < p>这是一条蛇。 < img src =snake.pngng-click =doSomethingAwesone('snake','playSound')>点击使他发出嘘声。< / p> 

返回页面控制器,然后添加相应的$ scope函数:



页面控制器

  $ scope.doSomethingAwesome = function(id ,action){
console.log(要做+ action +with+ id);
}

我无法弄清楚如何从内部调用'doSomethingAwesome'方法数据库中的HTML字符串。我意识到Angular必须以某种方式解析HTML字符串,但是如何?我读过关于$ compile服务的模糊混淆,并复制并粘贴了一些示例,但没有任何效果。另外,大多数示例显示的是动态内容只在指令的链接阶段进行设置。我们希望Page在应用程序的整个生命周期中保持活力。它会在用户翻页时不断接收,编译和显示新内容。

从抽象意义上讲,我想你可以说我们正试图在Angular应用程序中动态地嵌套Angular块,并且需要能够将它们交换出来。

我已经多次阅读了Angular文档的各个部分,以及各种博客帖子,以及JS用人们的代码弄了个手脚。我不知道我是否完全误解了Angular,或者只是错过了简单的东西,或者我很慢。在任何情况下,我都可以使用一些建议。

解决方案

ng-bind-html-unsafe 仅将内容呈现为HTML。它不会将Angular范围绑定到结果DOM。您必须为此使用 $ compile 服务。我创建了这个plunker 来演示如何使用 $ compile 创建用户输入的动态HTML指令并绑定到控制器的作用域。
$ b demo.html

 <!DOCTYPE html> 
< html ng-app =app>

< head>
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆