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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
Dec 01 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 Javascript
ES6 Object.assign()的用法及其使用
Jan 18 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中的按位与和按位或操作示例
2014/01/27 PHP
php 使用array函数实现分页
2015/02/13 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
jQuery each()小议
2010/03/18 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python zip()函数用法实例分析
2018/03/17 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
浅析Python函数式编程
2018/10/06 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
行政主管岗位职责
2013/11/18 职场文书
小学科学教学反思
2014/01/26 职场文书
禁止酒驾标语
2014/06/25 职场文书
师范毕业生求职信
2014/07/11 职场文书
个人求职自荐信范文
2015/03/06 职场文书
总经理致辞
2015/07/29 职场文书
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js