angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model。但在我们的项目当中会遇到这样的情况,后台返回的数据中带有各种各样的html标签。如:
$scope.currentWork.description = “hello,<br><b>今天我们去哪里?</b>”
我们用ng-bind-html这样的指令来绑定,结果却不是我们想要的。是这样的
hello,
今天我们去哪里?
怎么办呢?
对于angular 1.2一下的版本我们必须要使用$sce这个服务来解决我们的问题。所谓sce即“Strict Contextual Escaping”的缩写。翻译成中文就是“严格的上下文模式”也可以理解为安全绑定吧。来看看怎么用吧。
controller Code:
$http.get('/api/work/get?workId=' + $routeParams.workId).success(function (work) {$scope.currentWork = work;});HTML code
<p> {{currentWork.description}}</p>
我们返回的内容中包含一系列的html标记。表现出来的结果就如我们文章开头所说的那样。这时候我们必须告诉它安全绑定。它可以通过使用$ sce.trustAsHtml()。该方法将值转换为特权所接受并能安全地使用“ng-bind-html”。所以,我们必须在我们的控制器中引入$sce服务
controller('transferWorkStep2', ['$scope','$http','$routeParams','$sce', function ($scope,$http, $routeParams, $sce) { $http.get('/api/work/get?workId=' + $routeParams.workId) .success(function (work) { $scope.currentWork = work; $scope.currentWork.description = $sce.trustAsHtml($rootScope.currentWork.description); });
Html code:
<p ng-bind-html="currentWork.description"></p>
这样结果就完美的呈现在页面上了:
hello
今天我们去哪里?
咱们还可以这样用,把它封装成一个过滤器就可以在模板上随时调用了
app.filter('to_trusted', ['$sce', function ($sce) { return function (text) { return $sce.trustAsHtml(text); }; }]);
Html code:
<p ng-bind-html="currentWork.description | to_trusted"></p>
另外$sce还可以有以下用法:
$sce.trustAs(type,name); $sce.trustAsUrl(value); $sce.trustAsHtml(value); $sce.trustAsResourceUrl(value); $sce.trustAsJs(value);
1.trustAsResourceUrl
<html> <head> <meta charset="utf-8"> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> </head> <body> <div ng-app="myApp" ng-controller="myCtrl"> 第一种方式:<br/> 有$sce处理:<audio ng-src="{{sceControl(formData.mediaUrl)}}" controls="controls">您的浏览器不支持html5</audio><br/> 无$sce处理:<audio ng-src="{{formData.mediaUrl}}" controls="controls">您的浏览器不支持html5</audio><br/><br/> 第二种方式:<br/> <audio ng-src="{{data.url}}" controls="controls">您的浏览器不支持html5</audio> </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope,$sce){ //第一种方式数据源 $scope.formData={ "name":"视频", "mediaUrl":"http://res.audiogroup.cn/res/upload/agx_ims_creative/audio/20160307/bpryk96.mp3"//视频路径 }; $scope.sceControl = $sce.trustAsResourceUrl;//第一种处理方式 //第二种方式数据源 $scope.data={ "name":"视频", "url":"http://res.audiogroup.cn/res/upload/agx_ims_creative/audio/20160307/bpryk96.mp3"//视频路径 }; $scope.data.url = $sce.trustAsResourceUrl($scope.data.url);//第二种处理方式 }); </script> </body> </html>
2.trustAsHtml
<body> <div ng-app="myApp" ng-controller="myCtrl"> 未处理的: <div ng-repeat="item in formData"> {{item.name}} :{{item.htmlVal}} </div> <br/>处理过的:<button ng-click="look()">查看处理结果</button> <div ng-repeat="item in data"> {{item.name}} :<p ng-bind-html = "item.htmlVal"></p> </div> </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope,$sce){ //未处理数据源 $scope.formData=[ {"name":"张春玲","htmlVal":"我是<span style='color:red;'>张春玲<span>"}, {"name":"sb","htmlVal":"我是<span style='color:red;'>sb<span>"} ]; //处理结果 $scope.look = function(){alert $scope.data=[ {"name":"张春玲","htmlVal":"我是<span style='color:red;'>张春玲<span>"}, {"name":"sb","htmlVal":"我是<span style='color:red;'>sb<span>"} ]; for(var i=0;i<$scope.data.length;i++){ $scope.data[i].htmlVal = $sce.trustAsHtml($scope.data[i].htmlVal); } }; }); </script> </body>