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

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

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

 1 var myCommon = angular.module("myCommon",[]);
 2 myCommon.directive("myStandTable", function () {
 3     return {
 4         restrict: "A",
 5         templateUrl: "app/template/tableTem.html",
 6         transclude: false,
 7         replace: true,
 8         controller: function ($scope,$compile, commonService) {
 9             // do something...
10         },
11         link: function (scope, element, attris) {
12         }
13     }
14 });

tableTem.html文件代码如下:

 1 <div>
 2     <table class="table table-hover table-bordered">
 3         <thead>
 4             <tr>
 5                 <th ng-if="tableData.multiSelect">
 6                     <input type="checkbox" id="check-all" ng-model="itemsChecked">
 7                     <label for="check-all" class="fa" ng-class="{‘fa-square-o‘: !itemsChecked, ‘fa-check-square-o‘: itemsChecked }" aria-hidden="true">
 8                     </label>
 9                 </th>
10                 <th ng-repeat="item in tableData.thead">{{item}}</th>
11             </tr>
12         </thead>
13         <tbody>
14             <tr ng-repeat="item in tableData.items" ng-click="selectItem(item)" ng-init="item.selected = false" ng-class="{‘selected‘: item.selected}">
15                 <td ng-if="tableData.multiSelect">
16                     <input type="checkbox" id="check_{{$index}}" ng-model="item.selected">
17                     <label for="check_{{$index}}" class="fa" ng-class="{‘fa-square-o‘: !item.selected, ‘fa-check-square-o‘: item.selected }" aria-hidden="true">
18                     </label>
19                 </td>
20                 <td ng-repeat="name in tableData.theadName">
21                     {{item[name]}}
23
24                 </td>
25             </tr>
26         </tbody>
27     </table>
28 </div>

控制器文件代码如下:

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

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

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

1 myCommon.filter("trusted", function ($sce) {
2     return function (html) {
3         if (typeof html == "string") {
4             return $sce.trustAsHtml(html);
5         }
6         return html;
7     }
8 });

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

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

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

temp文件代码修改:

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

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

 1 myCommon.directive("compileBindExpn", function ($compile) {
 2     return function linkFn(scope, elem, attrs) {
 3         scope.$watch("::"+attrs.compileBindExpn, function (html) {
 4             if (html && html.indexOf("<") != -1 && html.indexOf(">") != -1) {
 5                 console.log(1);
 6                 var expnLinker = $compile(html);
 7                 expnLinker(scope, function transclude (clone) {
 8                     elem.empty();
 9                     elem.append(clone);
10                 });
11             } else {
12                 elem.empty();
13                 elem.append(html);
14             }
15         })
16     }
17 });

经过这种解决方法后,终于能够正常展示html代码,且其上的ng-click方法也能正常使用。

时间: 2024-10-10 07:15:23

AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html的相关文章

vue指令03---自动获取焦点(自定义指令)和过滤器的学习

1.1 自动获取焦点 在自动获取焦点的学习中涉及到了一个钩子函数 mounted(),它表示页面一加载进来就执行函数里面的内容,(和window.onload相似,这样有助于理解),mounted 钩子函数的名字不能随便更改,而且不能写在 methods 属性里面    方法1:  在vue中 通过操作 dom 元素来实现自动获取焦点(即使用原生JS实现) 代码如下: 1 <html lang="en"> 2 <head> 3 <title>自动获取

Part 6 AngularJS ng repeat directive

ng-repeat is similar to foreach loop in C#. Let us understand this with an example. Here is what we want to do. 1. For each employee we have in the employees array we want a table row. With in each cell of the table row we to display employee Firstna

angularJS中自定义指令

学习了angularJS一周,但是大部分时间被自定义指令占用了.博主表示自学互联网好心塞的,发现问题的视觉很狭窄,这比解决问题要更难.这篇文章首先介绍了自定义,然后介绍了在使用自定义指令遇到的问题. 代码模板: var myModule = angular.module("myModule",[]); myModule.directive('directiveName',function(){ return{ restrict:string, template:string, temp

Angular中的内置指令和自定义指令

NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 DOM 元素调用方法.定义行为绑定数据等. Why: 最大程度减少DOM操作,实现数据绑定,与业务逻辑进行交互. How: 指令主要分为两种:内置指令和自定义指令,通过下面的例子,简单记录一下如何去使用. 内置指令 在官方API文档上罗列了很多指令,内置指令可以分为:普通指令 和 事件指令,他们都是作用于HTML之上的,通过添加属性的方式来实现的.简单看一下一些

AngularJS之基础-5 路由(定义路由、使用路由)、自定义指令(Directive)

一.定义路由 ng-view - AngularJS 支持通过在单页面上的多个视图的单页应用 - ng-view 标记只是简单地创建一个占位符 - 使用 ng-template - 创建使用script标签的HTML视图 - 使用 - 定义类型作为主模块中 ng-template 的脚本块 $routeProvider - 映射相应的HTML页面或ng-template - 附加一个控制器使用相同键的服务   - 注意: - 需要angular-route.js脚本文件的引用 二.使用路由 锚点

什么是vue.js中的自定义指令?

问题一:什么是vue.js中的自定义指令? 自定义一些指令对底层DOM进行操作 更多参考 Vue里面有许多内置的指令,比如v-if和v-show,这些丰富的指令能满足我们的绝大部分业务需求,不过在需要一些特殊功能时,我们仍然希望对DOM进行底层的操作,这时就要用到自定义指令. 问题二:自定义指令的几个钩子函数 bind:只调用一次,指令第一次绑定到元素时调用.在这里可以进行一次性的初始化设置. inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中). upda

手写vue中v-bind:style效果的自定义指令

自定义指令 什么是自定义指令 以 v- 为前缀,然后加上自己定义好的名字组成的一个指令就是自定义指令.为什么要有自定义指令呢?在有些时候,你仍然需要对普通的DOM元素进行底层的操作,这个时候就可以用到自定义指令. 自定义指令的语法 全局自定义指令 // 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时-- inserted: function (el) { // 聚焦元素 el.focus() } }) 局部自

angular 指令系统(二)自定义指令:

AngularJS应用的模块中directive()这个方法是用来定义指令的, angular.module('myApp', []) .directive('myDirective', function ($timeout, UserDefinedService) { // 指令定义放在这里 }); directive() 方法可以接受两个参数: 1. name(字符串)     指令的名字,2.(函数)       这个函数返回一个对象,其中定义了指令的全部行为. $compile服务利用这

自定义指令的参数

指令无外乎增强了 HTML,提供额外的功能 以上的指令基本上已经可以满足我们的绝大多数需要了 少数情况下我们有一些特殊的需要,可以通过自定义指令的方式实现. 从更高的层次上说,指令是DOM元素上的一些标记(例如: 属性,元素名称,注释和一些CSS的类)用于转换DOM元素的内部或者对DOM元素进行一些行为上的绑定. 注意事项 自定义指令和自定义控制器都必须要挂载在模块之下.因为自定义指令的directive是angular.module下的一个方法,点击这里查看 具体用法为 angular.mod