• 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

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

  • 相关阅读:
    2020.10.10收获(动手动脑三)
    2020.10.8收获
    2020.10.4收获
    2020.10.11收获
    2020.10.6收获
    2020.10.7收获(动手动脑二)
    2020.10.9收获
    2020.10.3收获
    2020.10.2收获
    2020.10.5收获
  • 原文地址:https://www.cnblogs.com/xietong/p/7044127.html
Copyright © 2020-2023  润新知