首页 > 代码库 > angularjs下拉框实现渲染html

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="http://www.mamicode.com/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=http://www.mamicode.com/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="http://www.mamicode.com/{{data.id}}" ng-selected="data.id==value" ng-bind-html="data.text"> 4     </option> 5 </select> 6 <script src="http://www.mamicode.com/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=http://www.mamicode.com/‘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="http://www.mamicode.com/id" text="text" d-select-http://www.mamicode.com/value="value" ></drop-down-list> 3 {{value}} 4 <script src="http://www.mamicode.com/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=http://www.mamicode.com/20;10         $scope.testList=testList;11     }]);12     app.directive("dropDownList",["$sce",function ($sce) {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=http://www.mamicode.com/attrs["value"];//对应option的value22                 var text=attrs["text"];23                 var selectValue=http://www.mamicode.com/scope.dSelectValue;24                 element.on("change",function(){25                     var selectedIndex=this.selectedIndex;26                     scope.$apply(function(){27                         scope.dSelectValue=http://www.mamicode.com/selectedIndex;28                     });29                 })30 31                 for(var i=0;i<scope.dList.length;i++)32                 {33                     var option=d.createElement("option");34                     option.value=http://www.mamicode.com/scope.dList[i][value];35                     option.innerHTML=scope.dList[i][text];36                     if(selectValue=http://www.mamicode.com/=option.value)37                     {38                         option.setAttribute("selected",true);39                     }40                     element.append(option);41                 }42             },43             template:‘<select></select>‘,44             replace:true45 46         };47     }]);48 49 </script>50 </body>
View Code

 

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

angularjs下拉框实现渲染html