ng-bind-html strips elements attributes

大兔子大兔子 提交于 2019-12-01 13:44:22

问题


I'm trying to interpolate a string that contains some markup in a template.

In the controller:
$scope.message = "Hello moto <a ui-sref='home.test'>click</a>";

Template:

<div ng-bind-html="message.text"></div>

which renders as:

<div ng-bind-html="message.text" <div="" class="ng-binding">Hello moto <a>click</a></div>

Trying to use the following filter does not help either; the text is simpy escaped for either of the commented choices:

angular.module('test-filters', ['ngSanitize'])
    .filter('safe', function($sce) {
            return function(val) {
                return $sce.trustAsHtml(val);
                //return $sce.trustAsUrl(val);
                //return $sce.trustAsResourceUrl(val);
            };
    });

How can I interpolate my string without escaping it nor stripping attributes?

Edit: Plunker http://plnkr.co/edit/H4O16KgS0mWtpGRvW1Es?p=preview (updated with sylwester's version that has reference to ngSanitize


回答1:


Let have a look here http://jsbin.com/faxopipe/1/edit it is sorted now. It didn't work because there was another directive inside a tag 'ui-sref', so you have to use $sce service.

in your js please add method:

 $scope.to_trusted = function(html_code) {
    return $sce.trustAsHtml(html_code);

and in view :

<p ng-bind-html="to_trusted(message)"></p>



回答2:


In scenario where you are using ui.router path you must need to use $compile in combination with $sce for your dynamic html so that ui-sref work properly. If you don't do that you'll just see a Link which actually do not work.

e.g <span> Hello moto <a ui-sref='home.test'> Link </a> </span>

//You must need to add boundary conditions, this is just for demonstration
$scope.to_trusted = function(someHTML) {
    var compiledVal = $compile(someHTML)($scope);
    var compiledHTML = compiledVal[0].outerHTML;
    return $sce.trustAsHtml(compiledHTML);
}

And you use like this,

<p ng-bind-html="to_trusted(message)"></p>

Note that your message has to be a valid HTML starting from "<" so if you pass a non HTML to $compile you'll get jqlite error. I used <span> to handle your case.




回答3:


You missed reference to angular-sanitize.js and you have inject it as well to angular.app

var app = angular.module('plunker', ['ngSanitize']);

the simplest option in to bind html is ng-bind-html :

<li>link ng-html-bind <div ng-bind-html="message"></div></li>

please see Plunkr



来源:https://stackoverflow.com/questions/24178316/ng-bind-html-strips-elements-attributes

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!