angularjs下拉框实现渲染html

   angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击。但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框,代码如下:

 1 <body ng-app="app" ng-controller="controller">
 2 <select ng-model="value" ng-options="t.text for t in testList"></select>
 3 <script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
 4 <script type="text/javascript">
 5     var app= angular.module("app",[]);
 6     app.controller("controller",["$scope",function ($scope) {
 7         var testList=[{id:0,text:"&nbsp;&nbsp;全国"},{id:1,text:"&nbsp;北京"},{id:20,text:"&nbsp;&nbsp;&nbsp;上海"},{id:3,text:"&nbsp;&nbsp;福建"},{id:4,text:"&nbsp;&nbsp;山东"}];
 8         $scope.value=20;
 9         $scope.testList=testList;
10     }]);
11 </script>
12 </body>
View Code

           可以看到,空格直接被渲染为&nbsp;。一个简单粗暴的解决办法是修改angularjs源代码,不再对html进行过滤,在angularjs源码中搜索updateOptions函数,直接对相应脚本进行替换,如下图:

                  

    可以看到,空格已经被正确的渲染,这种方式虽然简单,但是修改将会影响到所有的下拉框控件,有可能会受到html攻击,一种比较中规中矩的办法是采用ng-bind-html来渲染html,这个时候下拉框绑定数据的方式也需要改变,相应代码如下:

 1 <body ng-app="app" ng-controller="controller">
 2 <select ng-module="value" >
 3     <option ng-repeat="data in testList"  value="{{data.id}}" ng-selected="data.id==value" ng-bind-html="data.text">
 4     </option>
 5 </select>
 6 <script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
 7 <script type="text/javascript">
 8    var app= angular.module("app",[]);
 9     app.controller("controller",["$scope","$sce",function ($scope,$sce) {
10         var testList=[{id:0,text:"&nbsp;&nbsp;全国"},{id:1,text:"&nbsp;北京"},{id:20,text:"&nbsp;&nbsp;&nbsp;上海"},{id:3,text:"&nbsp;&nbsp;福建"},{id:4,text:"&nbsp;&nbsp;山东"}];
11         for(var i=0;i<testList.length;i++)
12         {
13             testList[i].text=$sce.trustAsHtml( testList[i].text);
14         }
15         $scope.value='20';//注意,此处必须为字符串类型,否则无法获取选中的值
16         $scope.testList=testList;
17  
18     }]);
19 
20 </script>
21 </body>
View Code

    这种方式非常消耗性能,对于数据量不大的下拉框,这种方式完全可以满足需要,但是如果数据量稍微大些,浏览器就会出现明显的卡顿现象,这个时候可以自己写一个指令来实现下拉框,代码如下:

 1 <body ng-app="app" ng-controller="controller">
 2 <drop-down-list d-list="testList" value="id" text="text" d-select-value="value" ></drop-down-list>
 3 {{value}}
 4 <script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
 5 <script type="text/javascript">
 6     var app= angular.module("app",[]);
 7     app.controller("controller",["$scope","$window",function ($scope,$window) {
 8         var testList=[{id:0,text:"&nbsp;&nbsp;全国"},{id:1,text:"&nbsp;北京"},{id:20,text:"&nbsp;&nbsp;&nbsp;上海"},{id:3,text:"&nbsp;&nbsp;福建"},{id:4,text:"&nbsp;&nbsp;山东"}];
 9         $scope.value=20;
10         $scope.testList=testList;
11     }]);
12     app.directive("dropDownList",function () {
13         return{
14             restrict:'E',
15             scope :{
16                 dList:'=',
17                 dSelectValue:'='
18             } ,
19             link:function(scope, element, attrs) {
20                 var d=document;
21                 var value=attrs["value"];//对应option的value
22                 var text=attrs["text"];
23                 var selectValue=scope.dSelectValue;
24                 element.on("change",function(){
25                     var selectedIndex=this.selectedIndex;
26                     scope.$apply(function(){
27                         scope.dSelectValue=selectedIndex;
28                     });
29                 })
30 
31                 for(var i=0;i<scope.dList.length;i++)
32                 {
33                     var option=d.createElement("option");
34                     option.value=scope.dList[i][value];
35                     option.innerHTML=scope.dList[i][text];
36                     if(selectValue==option.value)
37                     {
38                         option.setAttribute("selected",true);
39                     }
40                     element.append(option);
41                 }
42             },
43             template:'<select></select>',
44             replace:true
45 
46         };
47     });
48 
49 </script>
50 </body>
View Code

 

  这种方式可以比较完美的实现相应功能,是一种较好的选择。

posted on 2017-06-18 13:34  大朋展翅  阅读(1053)  评论(0编辑  收藏  举报

导航