AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法


Posted in Javascript onJanuary 19, 2017

今天用angular写table的时候,遇到了一个问题。在ng-repeat中,含有动态的html,而这些html中含有自定义指令。

因为希望实现一个能够复用的table,所以定义了一个指令myStandTable,指令代码大概如下:

var myCommon = angular.module("myCommon",[]);
myCommon.directive("myStandTable", function () {
 return {
 restrict: "A",
 templateUrl: "app/template/tableTem.html",
 transclude: false,
 replace: true,
 controller: function ($scope,$compile, commonService) {
  // do something... 
 },
 link: function (scope, element, attris) {
 }
 }
});

tableTem.html文件代码如下:

<div>
 <table class="table table-hover table-bordered">
 <thead>
  <tr>
  <th ng-if="tableData.multiSelect">
   <input type="checkbox" id="check-all" ng-model="itemsChecked">
   <label for="check-all" class="fa" ng-class="{'fa-square-o': !itemsChecked, 'fa-check-square-o': itemsChecked }" aria-hidden="true">
   </label>
  </th>
  <th ng-repeat="item in tableData.thead">{{item}}</th>
  </tr>
 </thead>
 <tbody>
  <tr ng-repeat="item in tableData.items" ng-click="selectItem(item)" ng-init="item.selected = false" ng-class="{'selected': item.selected}">
  <td ng-if="tableData.multiSelect">
   <input type="checkbox" id="check_{{$index}}" ng-model="item.selected">
   <label for="check_{{$index}}" class="fa" ng-class="{'fa-square-o': !item.selected, 'fa-check-square-o': item.selected }" aria-hidden="true">
   </label>
  </td>
  <td ng-repeat="name in tableData.theadName">
   {{item[name]}}
   
  </td>
  </tr>
 </tbody>
 </table>
</div>

控制器文件代码如下:

var myBasis = angular.module("myBasis",["myCommon"]);
myBasis.controller("myCtrl", function ($scope) {
 $scope.tableData = {
 multiSelect: false,
 pageSize: [10, 20, 50],
 thead: ["导入时间", "导入名称", "结果", "操作"],
 theadName: ["importDate", "name", "result", "oper"]
 };
});

以上,完成了表格展示数据的功能,可是在表格列里面,经常有对某行数据的操作,而这些操作我们同样需要以html的形式插入到表格里面,并且这些html中,还会有ng-click等之类的指令,或者是自定义的指令。比如:"<a href='javascript:;' ng-click='show(item)'>查看信息</a>"; 这类的html,插入到td中,会以html代码展示出来,并不会转换成html。

在网上查阅了方法后,找到了一个转html的解决办法,增加一个过滤器,如下:

myCommon.filter("trusted", function ($sce) {
 return function (html) {
 if (typeof html == "string") {
  return $sce.trustAsHtml(html);
 }
 return html;
 }
});

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

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

通过以上方法,确实可以将html转成正常的结果,可是a标签上的ng-click却没有效果,查看了问题的关键,是这段html并没有经过angular的编译,所以ng-click不起作用,需要手动编译,修改如下:

temp文件代码修改:

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

当item[name] 等于 "<a href='javascript:;' ng-click='show(item)'>查看信息</a>"时,我们需要通过compileBindExpn指令来手动编译,再放到div里面去。指令代码如下:

myCommon.directive("compileBindExpn", function ($compile) {
 return function linkFn(scope, elem, attrs) {
 scope.$watch("::"+attrs.compileBindExpn, function (html) {
  if (html && html.indexOf("<") != -1 && html.indexOf(">") != -1) {
  console.log(1);
  var expnLinker = $compile(html);
  expnLinker(scope, function transclude (clone) {
   elem.empty();
   elem.append(clone);
  });
  } else {
  elem.empty();
  elem.append(html);
  }
 })
 }
});

经过这种解决方法后,终于能够正常展示html代码,且其上的ng-click方法也能正常使用。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
Mar 10 Javascript
javascript基本语法分析说明
Jun 15 Javascript
JavaScript 函数式编程的原理
Oct 16 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
jQuery中parent()方法用法实例
Jan 07 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
微信小程序实现tab和swiper切换结合效果
Jul 17 Javascript
微信小程序收货地址API兼容低版本解决方法
May 18 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
Aug 22 Javascript
Antd表格滚动 宽度自适应 不换行的实例
Oct 27 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 #Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 #Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 #Javascript
Reactjs实现通用分页组件的实例代码
Jan 19 #Javascript
react.js 翻页插件实例代码
Jan 19 #Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
Jan 19 #Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 #Javascript
You might like
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
几个SQL的面试题
2014/03/08 面试题
大学应届生求职简历的自我评价
2013/10/08 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
教师工作表现自我评价
2015/03/05 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python