今天用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方法也能正常使用。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。