2017-02-23 102 views
0

让supose我们需要消毒的HTML字符串,我们不能用NG绑定HTML的指令,例如:AngularJS和消毒 - 消毒HTML没有ngBind指令

<span data-toggle="tooltip" title="Edit {{customer.name}}">Text</span> 

如果我们有特殊字符customer.name这行会打印成html版本,如&eacute;,我们想要é

我与测试:

  • $sce.trustAsHtml(customer.name)
  • $sce.parseAsHtml(customer.name)

但没有什么可以 “翻译” 这个网站。如何做到这一点?

一个简短的解释是:如何净化指令内的html(不在ng-bind-html正文中)。

回答

0

oficial documentation

ngBindHtml使用$ sce.parseAsHtml(绑定表达式)。下面是实际的代码(略微简化):

var ngBindHtmlDirective = ['$sce', function($sce) { 
    return function(scope, element, attr) { 
    scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { 
     element.html(value || ''); 
    }); 
    }; 
}]; 

所以我认为你需要的是$sce.parseAsHtmlhttps://docs.angularjs.org/api/ng/service/$sce#parseAsHtml)。


如果你无法说服角反正打印HTML,你可以尝试使用

customer.name.replace(/&eacute;/g, String.fromCharCode(233)); 

你可以找到一些基本的代码在这里:http://www.javascripter.net/faq/accentedcharacters.htm

这应该工作,但这绝对不是最好的解决方案。你应该总是使用ng-bind-html

+0

是的,我知道这个解决方案,总是取代wil work。但我的问题是关于使用ngSanitize插件为了对ng-bind-html之外的每个html char(甚至是不安全的)进行消毒处理,我的意思是你不能像我展示的例子那样使用指令。还是要谢谢你的帮助。 –

+0

我在askin之前尝试过这个解决方案。我做了一个'return $ sce.parseAsHtml(value)'函数,但它没有用,并且在HTML标题=“Edit {{parseCode(customer.name)}}”中。 –

1

它不一定非常复杂。

取而代之,在元素上使用setAttributetextContent(V.S. innerHTML),浏览器本身将负责为您进行消毒。

// To set element attributes 
$span.setAttribute("title", "Edit" + customer.name); 

// To set element content 
$span.textContent = customer.name; 

有关更多详细信息,请参见the post here。当然,这些都是一次性绑定,所以如果你需要更新,只需在中间扔$watch

+0

是的,它可能是一种解决方案,没有那么优雅或有角度的解决方案。它可以在控制器中生成大量的源代码,具体取决于您必须执行的sanizitations的数量,即使有很多模块化的功能涉及范围和手表。这是我唯一的解决方案,我想我必须接受它。非常感谢你的帮助。 –