angualrjs處於安全的考慮,插值 指令會對相應字元串進行過濾,避免出現html攻擊。但是在一些時候,我們需要渲染html,比如實現一個分級的下拉框,代碼如下: 1 <body ng-app="app" ng-controller="controller"> 2 <select ng-model ...
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:" 全國"},{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"></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<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:" 全國"},{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的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
這種方式可以比較完美的實現相應功能,是一種較好的選擇。