angularjs下拉框實現渲染html

來源:互聯網
上載者:User

標籤:directive   類型   stash   ng-repeat   model   空格   document   cli   pen   

   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",["$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=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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.