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 相关文章推荐
超级简单的图片防盗(HTML),好用
Apr 08 Javascript
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
判断日期是否能跨月查询的js代码
Jul 25 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
React学习笔记之事件处理(二)
Jul 02 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 Javascript
Vue组件化开发之通用型弹出框的实现
Feb 28 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
基于canvasJS在PHP中制作动态图表
May 30 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 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 图片上传实现代码 带详细注释
2010/04/29 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
Python切片用法实例教程
2014/09/08 Python
极简的Python入门指引
2015/04/01 Python
python简单实例训练(21~30)
2017/11/15 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
python argparser的具体使用
2019/11/10 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
员工拾金不昧表扬信
2014/01/09 职场文书
行政助理的岗位职责
2014/02/18 职场文书
写给老婆的检讨书
2014/02/21 职场文书
课外访万家心得体会
2014/09/03 职场文书
详解Redis瘦身指南
2021/05/26 Redis
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js