AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html
今天用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方法也能正常使用。
AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html的更多相关文章
- 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 ...
- Vue自定义指令 数据传递
在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...
- AngularJS 指令中的require
require参数可以被设置为字符串或数组,字符串代表另外一个指令的名字.require会将控制器注入到其值所指定的指令中,并作为当前指令的链接函数的第四个参数.字符串或数组元素的值是会在当前指令的作 ...
- angularJS中自定义指令
学习了angularJS一周,但是大部分时间被自定义指令占用了.博主表示自学互联网好心塞的,发现问题的视觉很狭窄,这比解决问题要更难.这篇文章首先介绍了自定义,然后介绍了在使用自定义指令遇到的问题. ...
- Angular中的内置指令和自定义指令
NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 DOM 元素调用方法.定义行为绑定数据等. Why: 最大程度减 ...
- Angular6在自定义指令中使用@HostBingDing() 和@HostListener()
emmm,,,最近在为项目的第二阶段铺路,偶然看到directive,想想看因为项目已经高度集成了第三方组件,所以对于自定义指令方面的经验自己实在知之甚少,后面经过阅读相关资料,总结一篇关于在自定义指 ...
- angularjs - 自定义指令(directive)
自定义指令(directive) 使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 例子:使用驼峰法来命名一个指令, demoDirect ...
- 在vue中创建自定义指令
原文:https://dev.to/ratracegrad/creating-custom-directives-in-vue-58hh 翻译:心上有杨 指令是带有 v- 前缀的特殊属性.指令的作用是 ...
- vue中自定义指令的使用
原文地址 vue中除了内置的指令(v-show,v-model)还允许我们自定义指令 想要创建自定义指令,就要注册指令(以输入框获取焦点为例) 一.注册全局指令: // 注册一个全局自定义指令 `v- ...
随机推荐
- IOS开发中UIFont字体设置
我们在开发中很多时候要设置UIlabel,UIbutton,UItextfield的字体,这个时候我们就需要用到UIFont,下面简单介绍一下UIFont的用法,仅供参考. UIFont用于获取和设置 ...
- Sqlserver 时间字段批量增加
update dt_article_attribute_value set end_time = dateadd(mi,30,start_time) create table tb(dt dateti ...
- 优酷、YouTube、Twitter及JustinTV几个视频网站的架构
优酷视频网站架构 一.网站基本数据概览据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最 ...
- JAVA中用于处理字符串的“三兄弟”
JAVA中用于处理字符串常用的有三个类:java.lang.String.java.lang.StringBuffer.java.lang.StringBuilder,这三者的共同之处都是final类 ...
- HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013
题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1, 若 ...
- Web开发者的最爱 5个超实用的HTML5 API
摘要:毫无疑问,HTML5已经成为当今最流行的一门技术,尤其是Web开发者们对HTML5的兴趣是日趋渐浓.HTML5的许多功能也都能在现代浏览器中得以实现.然而,作为开发者,除了关注HTML5的功能和 ...
- iOS 开源库 之 AFNetWorking 2.x
1. 网络请求的基本知识 2. Get/Post 请求的使用 3. 文件(图片)上传 4. 断点下载 5. 其它使用细节 6. 设计优良的地方
- Eclipse 打开文件所在文件夹
右击文件 > Show In > System Explorer
- c# silverlight
分享 tsc 条码打印机 打印控件 调用方法 , c# silverlight 下载 TSCLIB.dll http://download.csdn.net/detail/peiyu_peiyu/47 ...
- Apache的.htaccess到Nginx的转换
今天项目要求从Apache转到Nginx,遇到了要将原来的rewrite规则移过来的问题,找了半天资源,居然有一个转换工具,地址如下: http://www.anilcetin.com/convert ...