AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
今天用angular写table的时候,遇到了一个问题。在ng-repeat中,含有动态的html,而这些html中含有自定义指令。
因为希望实现一个能够复用的table,所以定义了一个指令myStandTable,指令代码大概如下:
varmyCommon=angular.module("myCommon",[]);
myCommon.directive("myStandTable",function(){
return{
restrict:"A",
templateUrl:"app/template/tableTem.html",
transclude:false,
replace:true,
controller:function($scope,$compile,commonService){
//dosomething...
},
link:function(scope,element,attris){
}
}
});
tableTem.html文件代码如下:
<div>
<tableclass="tabletable-hovertable-bordered">
<thead>
<tr>
<thng-if="tableData.multiSelect">
<inputtype="checkbox"id="check-all"ng-model="itemsChecked">
<labelfor="check-all"class="fa"ng-class="{'fa-square-o':!itemsChecked,'fa-check-square-o':itemsChecked}"aria-hidden="true">
</label>
</th>
<thng-repeat="itemintableData.thead">{{item}}</th>
</tr>
</thead>
<tbody>
<trng-repeat="itemintableData.items"ng-click="selectItem(item)"ng-init="item.selected=false"ng-class="{'selected':item.selected}">
<tdng-if="tableData.multiSelect">
<inputtype="checkbox"id="check_{{$index}}"ng-model="item.selected">
<labelfor="check_{{$index}}"class="fa"ng-class="{'fa-square-o':!item.selected,'fa-check-square-o':item.selected}"aria-hidden="true">
</label>
</td>
<tdng-repeat="nameintableData.theadName">
{{item[name]}}
</td>
</tr>
</tbody>
</table>
</div>
控制器文件代码如下:
varmyBasis=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等之类的指令,或者是自定义的指令。比如:"<ahref='javascript:;'ng-click='show(item)'>查看信息</a>";这类的html,插入到td中,会以html代码展示出来,并不会转换成html。
在网上查阅了方法后,找到了一个转html的解决办法,增加一个过滤器,如下:
myCommon.filter("trusted",function($sce){
returnfunction(html){
if(typeofhtml=="string"){
return$sce.trustAsHtml(html);
}
returnhtml;
}
});
然后修改temp文件中的代码:
<tdng-repeat="nameintableData.theadName"> <spanng-bind-html="item[name]|trusted"></span> </td>
通过以上方法,确实可以将html转成正常的结果,可是a标签上的ng-click却没有效果,查看了问题的关键,是这段html并没有经过angular的编译,所以ng-click不起作用,需要手动编译,修改如下:
temp文件代码修改:
<tdng-repeat="nameintableData.theadName"> <divcompile-bind-expn="item[name]"> </div> </td>
当item[name]等于"<ahref='javascript:;'ng-click='show(item)'>查看信息</a>"时,我们需要通过compileBindExpn指令来手动编译,再放到div里面去。指令代码如下:
myCommon.directive("compileBindExpn",function($compile){
returnfunctionlinkFn(scope,elem,attrs){
scope.$watch("::"+attrs.compileBindExpn,function(html){
if(html&&html.indexOf("<")!=-1&&html.indexOf(">")!=-1){
console.log(1);
varexpnLinker=$compile(html);
expnLinker(scope,functiontransclude(clone){
elem.empty();
elem.append(clone);
});
}else{
elem.empty();
elem.append(html);
}
})
}
});
经过这种解决方法后,终于能够正常展示html代码,且其上的ng-click方法也能正常使用。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!