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 相关文章推荐
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 Javascript
jQuery下通过replace字符串替换实现大小图片切换
May 22 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
Sep 01 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
Bootstrap fileinput组件封装及使用详解
Mar 10 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
May 02 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
Dec 26 Javascript
微信小程序实现简单表格
Feb 14 Javascript
vue 子组件和父组件传值的示例
Sep 11 Javascript
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
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
2006/10/09 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
最常用的12种设计模式小结
2011/08/09 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
python列表与元组详解实例
2013/11/01 Python
java直接调用python脚本的例子
2014/02/16 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
python的socket编程入门
2018/01/29 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
super()与this()的区别
2016/01/17 面试题
大学生创业感言
2014/01/25 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书