• 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方法也能正常使用。

  • 相关阅读:
    NOIP 2017逛公园(记忆化搜索)
    NOIP 2012疫情控制 (二分+倍增+贪心)
    NOIP 2005过河(DP+路径压缩)
    P1198 [JSOI2008]最大数
    [Noip2016]蚯蚓
    [六省联考2017]期末考试
    六省联考:组合数问题
    蒜头君的兔子
    bzoj1015 [JSOI2008]星球大战starwar
    luogu P3370 【模板】字符串哈希
  • 原文地址:https://www.cnblogs.com/sloane/p/6305759.html
Copyright © 2020-2023  润新知