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?1.1.11"></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: 全国},{id:1,text: 北京},{id:20,text: 上海},{id:3,text: 福建},{id:4,text: 山东}]; 8 $scope.value=20; 9 $scope.testlist=testlist;10 }]);11 </script>12 </body>
view code
可以看到,空格直接被渲染为 。一个简单粗暴的解决办法是修改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?1.1.11"></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: 全国},{id:1,text: 北京},{id:20,text: 上海},{id:3,text: 福建},{id:4,text: 山东}];11 for(var i=0;i
这种方式非常消耗性能,对于数据量不大的下拉框,这种方式完全可以满足需要,但是如果数据量稍微大些,浏览器就会出现明显的卡顿现象,这个时候可以自己写一个指令来实现下拉框,代码如下:
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?1.1.11"></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: 全国},{id:1,text: 北京},{id:20,text: 上海},{id:3,text: 福建},{id:4,text: 山东}]; 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的value22 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:true45 46 };47 });48 49 </script>50 </body>
view code
这种方式可以比较完美的实现相应功能,是一种较好的选择。
以上就是angularjs下拉框实现渲染html的详细内容。