AngularJs ng-repeat指令中怎么實現含有自定義指令的動態html


今天用angular寫table的時候,遇到了一個問題。在ng-repeat中,含有動態的html,而這些html中含有自定義指令。

因為希望實現一個能夠復用的table,所以定義了一個指令myStandTable,指令代碼大概如下:

 1 var myCommon = angular.module("myCommon",[]);
 2 myCommon.directive("myStandTable", function () {
 3     return {
 4         restrict: "A",
 5         templateUrl: "app/template/tableTem.html",
 6         transclude: false,
 7         replace: true,
 8         controller: function ($scope,$compile, commonService) {
 9             // do something... 
10         },
11         link: function (scope, element, attris) {
12         }
13     }
14 });

tableTem.html文件代碼如下:

 1 <div>
 2     <table class="table table-hover table-bordered">
 3         <thead>
 4             <tr>
 5                 <th ng-if="tableData.multiSelect">
 6                     <input type="checkbox" id="check-all" ng-model="itemsChecked">
 7                     <label for="check-all" class="fa" ng-class="{'fa-square-o': !itemsChecked, 'fa-check-square-o': itemsChecked }" aria-hidden="true">
 8                     </label>
 9                 </th>
10                 <th ng-repeat="item in tableData.thead">{{item}}</th>
11             </tr>
12         </thead>
13         <tbody>
14             <tr ng-repeat="item in tableData.items" ng-click="selectItem(item)" ng-init="item.selected = false" ng-class="{'selected': item.selected}">
15                 <td ng-if="tableData.multiSelect">
16                     <input type="checkbox" id="check_{{$index}}" ng-model="item.selected">
17                     <label for="check_{{$index}}" class="fa" ng-class="{'fa-square-o': !item.selected, 'fa-check-square-o': item.selected }" aria-hidden="true">
18                     </label>
19                 </td>
20                 <td ng-repeat="name in tableData.theadName">
21                     {{item[name]}}
23                     
24                 </td>
25             </tr>
26         </tbody>
27     </table>
28 </div>

控制器文件代碼如下:

1 var myBasis = angular.module("myBasis",["myCommon"]);
2 myBasis.controller("myCtrl", function ($scope) {
3     $scope.tableData = {
4         multiSelect: false,
5         pageSize: [10, 20, 50],
6         thead: ["導入時間", "導入名稱", "結果", "操作"],
7         theadName: ["importDate", "name", "result", "oper"]
8     };
9 });

以上,完成了表格展示數據的功能,可是在表格列里面,經常有對某行數據的操作,而這些操作我們同樣需要以html的形式插入到表格里面,並且這些html中,還會有ng-click等之類的指令,或者是自定義的指令。比如:"<a href='javascript:;' ng-click='show(item)'>查看信息</a>"; 這類的html,插入到td中,會以html代碼展示出來,並不會轉換成html。

在網上查閱了方法后,找到了一個轉html的解決辦法,增加一個過濾器,如下:

1 myCommon.filter("trusted", function ($sce) {
2     return function (html) {
3         if (typeof html == "string") {
4             return $sce.trustAsHtml(html);
5         }
6         return html;
7     }
8 });

然后修改temp文件中的代碼:

1 <td ng-repeat="name in tableData.theadName">
2      <span ng-bind-html="item[name] | trusted"></span>3 </td>

通過以上方法,確實可以將html轉成正常的結果,可是a標簽上的ng-click卻沒有效果,查看了問題的關鍵,是這段html並沒有經過angular的編譯,所以ng-click不起作用,需要手動編譯,修改如下:

temp文件代碼修改:

1 <td ng-repeat="name in tableData.theadName">
2      <div compile-bind-expn = "item[name]">
3      </div>
4 </td>

當item[name] 等於 "<a href='javascript:;' ng-click='show(item)'>查看信息</a>"時,我們需要通過compileBindExpn指令來手動編譯,再放到div里面去。指令代碼如下:

 1 myCommon.directive("compileBindExpn", function ($compile) {
 2     return function linkFn(scope, elem, attrs) {
 3         scope.$watch("::"+attrs.compileBindExpn, function (html) {
 4             if (html && html.indexOf("<") != -1 && html.indexOf(">") != -1) {
 5                 console.log(1);
 6                 var expnLinker = $compile(html);
 7                 expnLinker(scope, function transclude (clone) {
 8                     elem.empty();
 9                     elem.append(clone);
10                 });
11             } else {
12                 elem.empty();
13                 elem.append(html);
14             }
15         })
16     }
17 });

經過這種解決方法后,終於能夠正常展示html代碼,且其上的ng-click方法也能正常使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM