渲染HTML中angularJS 1.x中
问题描述:
我有一个指令,并I'm与IMG SRC更换IMG的URL内嵌显示图像渲染HTML中angularJS 1.x中
function message($filter) {
var directive = {
restrict: 'EA',
scope: {
data: '='
},
link: function(scope, elem, attrs) {
scope.data.content = scope.data.content.replace(/(https?:\/\/\S+(\.png|\.jpeg|\.jpg|\.gif))/g, "<img src='$1' alt=''>");
},
template: '<span>{{data.nickname}}:</span> {{data.content}}'
};
return directive;
}
而是看到的图像内嵌I'm看到HTML标签作为我正在调查$ sce但我不确定如何在指令中使用它。
答
你更接近!您正在与ngSanitize
模块合作。
它基本上允许您在您的模板中编写原始HTML(使用ng-bind-html
指令)。你需要把它列入你的页面,并宣布它为你这样的模块中的依赖性:
<!-- HTML -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-sanitize/1.6.2/angular-sanitize.min.js"></script>
// JavaScript
angular.module("yourapp", ['ngSanitize']);
,然后绑定使用ng-bind-html
指令,这样在div
您的HTML内容(或其他):
template: '<span>{{data.nickname}}:</span> <div ng-bind-html="data.content"></div>'
现在,原始HTML内容data.content
将被替换为您的指令模板中的内容。这里有一个working plunker供您参考。
答
所以,一个更有角度和更安全的方法是不直接将html写入模板。相反,你可以使用大括号把图像的URL在这样的模板:
template: `
<span>{{data.nickname}}:</span>
<img ng-if="{{data.hasImage}}" src="{{data.url}}" alt="">
`
这保留模板/数据分离。
你的方式,你把自己放在XSS的风险。为了将生成的html放入模板中,有一个原因使得您可以跳过这些循环。如果用户曾经能够上传带有js的图片,您的网站可能会被黑客入侵。 Angular的正常模板可以自动防止这种攻击。
如果您需要多个图像,可以为数据中的每个对象添加一个url属性,将数据数组放在范围内,然后使用ng-repeat呈现对象数组。
正如你所看到的IMG标签只有当在规定的附加图片的一端看到一只网址 – handsome
你说得对,我已经更新了我的答案使用创建NG-如果模板,我添加了“hasImage”属性。我还添加了一个解释,为什么最好不要在js中做html模板。 – frodo2975