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 相关文章推荐
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 Javascript
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
vue配置font-awesome5的方法步骤
Jan 27 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 Javascript
layui动态渲染生成select的option值方法
Sep 23 Javascript
详解Vue数据驱动原理
Nov 17 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
ZF等常用php框架中存在的问题
2008/01/10 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
美国玩具公司:U.S.Toy
2018/05/19 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
校园新闻广播稿
2014/01/10 职场文书
学校安全检查制度
2014/01/27 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
鸟的天堂导游词
2015/01/31 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android